autowired有四种模式,byName,byType,constructor,autodetect
其中@Autowired注解使用的是byType方式的,byType方式是根据属性类型在容器中寻找bean类。
举个栗子:拿这个栗子分析
@Autowired
SchoolService schoolService;
具体做的事情:
1.Spring会先去容器中去寻找SchoolService类型的bean(先不扫描schoolService字段)
2.若找不到一个bean,会抛出异常(可以通过设置required=false)为不抛出异常
3.若找到一个SchoolService类型的bean,自动匹配,并把bean装配到schoolService中
4.若SchoolService类型的bean有多个,则扫描后面的schoolService字段进行名字匹配,
匹配成功后将bean装配到schoolService中。
一个可能会用到的注解@Qualifier:寻找指定名称的bean:baseDao
@Autowired()
@Qualifier("baseDao")
private BaseDao baseDao;
使用方法:默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称相配的bean时才会按照类型进行装配。如果指定了name,就会按照name来找bean。
@Resource(name="baseDao")
private BaseDao baseDao;
@Service是@Component注解的一个特例,作用在类上。其作用域默认为singleton。使用注解配置和类路径扫描时,被@Service注解标注的类会被Spring扫描并注册为Bean。@Service用于标注业务层组件。如果@Service没有传递参数是,bean名称默认为当前类的类名,首字母小写,如果指定了name,注册的bean名称就为指定名称。
@Service(value="schoolservice")
@Service("schoolservice")
作用在类和方法上,用来配置spring bean的作用域。
@Service
@Scope("singleton")
public class SingletonScope{
public SingletonScope(){
}
}
@Entity注解在实体类(domain层上)
@Table(name = “数据库表名”),这个注解也注释在实体类上,对应数据库中相应的表
@Id、@Column注解用于标注实体类中的字段,主键字段标注为@Id、其余为@Column。
配合@Configuration使用,@Configuration写在类上,相当于xml里的,@Bean写在方法上,相当于,表示一个bean的方法
通过该注解指定加载的顺序,优先级高的先加载,数字越小的优先级越高
被@Controller标注的类为一个控制器,用于处理http请求
相当于@ResponseBody和@Controller的配合。@ResponseBody告诉控制器该类的方法返回对象都会被自动序列化为JSON,并且传回HttpResponse这个对象。
用来配置url隐射,写在controller类和其方法上
是@RequestMapping(value = “/say”,method = RequestMethod.GET)等价于@GetMapping(value = “/say”)
在@RequestMapping注解中用{}来表明它的变量部分
@RequestMapping(value = “/user/{username}”)
这个{username}就是我们定义的变量规则,username是变量的名字,这个Url路由可以匹配以下任意Url
/user/Tom
/user/Mary
/user/Jimmy
也可以写正则表达式匹配
@RequestMapping(value = “/user/{username:[a-zA-Z0-9]+}/blog/{blogId}}”)
@Controller
@RequestMapping("/User")
public class HelloWorldController {
@RequestMapping("/getUser/{uid}")
public String getUser(@PathVariable("uid")Integer id, Model model) {
System.out.println("id:"+id);
model.addAttribute("userName","小明");
model.addAttribute("phone","123456");
return "user";
}
}
url:http://192.168.1.100:8082/springboot-demo/User/1111/getUser
写在方法的参数前,表示这个参数是url中传递过来的参数。
url:http://192.168.1.100:8082/springboot-demo/User/getUser?uid=112&q=web
uid=112&q=web就是请求参数,不同参数之间使用&分隔。可以获取多个参数。
@RequestMapping(value="/user")
public String getUserBlog(@RequestParam(value="id") int blogId) {
return "blogId="+blogId;
}
是一个复合注解,包括@ComponentScan和@SpringBootConfiguration @EnableAutoConfiguration
继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或者多个@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
该注解的作用为启动自动的配置,SpringBoot根据你添加的jar包来配置你项目的默认配置。比如根据spring-boot-starter-web,来判断你的项目是否需要添加了webmvc和tomcat,就会自动的帮你配置web项目中所需要的默认配置。
扫描当前包以及其子包下被@Component,@Controller,@Service,@Repository等注解标注的类并纳入到spring容器中进行管理。
在Java配置文件中引入xml配置文件,可用@ImportResource
功能类似于XML配置,用来导入配置类,可以导入带有@Configuration注解的配置类或者实现了ImportSelector/ImportBeanDefinitionResgister,或者导入普通的pojo(Spring会将其注册称为Spring bean)
@SpringBootApplication
@Import({SmsConfig.class})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
编程式事务管理:使用TransactionTemplate或者使用底层的PlatformTransactionManager
声明式事务:建立在AOP之上,其本质是对方法前后进行拦截,通过@Transactional就可以进行事务操作,更快捷而且简单。
注解:@Transactional
具体配置可以参见:https://blog.csdn.net/chen_yuxi/article/details/98495210
@Slf4j
如果是自己写日志需要:
private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);
每次写新的类,就需要重新写logger
此时可以使用@Slf4j注解
先需要在pom文件中引入lombok
org.projectlombok
lombok
true
然后在方法中直接使用log.info()等等
如果注解@Slf4j注入后找不到变量log,需要在IDEA中安装插件lombok
参考资料:https://www.cnblogs.com/wangzhuxing/p/10141428.html#_label3_1