从广义上Spring注解可以分为两类:
一类注解是用于注册Bean
假如IOC容器就是一间空屋子,首先这间空屋子啥都没有,我们要吃大餐,我们就要从外部搬运食材和餐具进来。这里把某一样食材或者某一样餐具搬进空屋子的操作就相当于每个注册Bean的注解作用类似。注册Bean的注解作用就是往IOC容器中放(注册)东西!
用于注册Bean的注解: 比如@Component、@Repository、@Controller、@Service、@Configration这些注解就是用于注册Bean,放进IOC容器中,一来交给spring管理方便解耦,二来还可以进行二次使用,啥是二次使用呢?这里的二次使用可以理解为:在你开始从外部搬运食材和餐具进空屋子的时候,一次性搬运了猪肉、羊肉、铁勺、筷子四样东西,这个时候你要开始吃大餐,首先你吃东西的时候肯定要用筷子或者铁勺,别说你手抓,只要你需要,你就会去找,这个时候发现你已经把筷子或者铁勺放进了屋子,你就不用再去外部拿筷子进屋子了,意思就是IOC容器中已经存在,就可以只要拿去用,而不必再去注册!而拿屋子里已有的东西的操作就是下面要讲的用于使用Bean的注解!
一类注解是用于使用Bean
用于使用Bean的注解:比如@Autowired , @Resource注解,这些注解就是把屋子里的东西自己拿来用,如果你要拿,前提一定是屋子(IOC)里有的,不然就会报错,比如你要做一道牛肉拼盘需要五头牛做原材料才行,你现在锅里只有四头牛,这个时候你知道,自己往屋子里搬过五头牛,这个时候就直接把屋子里的那头牛直接放进锅里,完成牛肉拼盘的组装。是的这些注解就是需要啥想要啥,只要容器中有就往容器中拿!而这些注解又有各自的区别,比如@Autowired用在筷子上,这筷子你可能只想用木质的,或许只想用铁质的,@Autowired作用在什么属性的筷子就那什么筷子,而@Resource如果用在安格斯牛肉上面,就指定要名字就是安格斯牛肉的牛肉。
@bean
注解@Component
、@Repository
、@Controller
、@Service
这些注解只局限于自己编写的类,而@Bean
注解和@Import
能把第三方库中的类实例加入IOC容器中并交给spring管理
Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。 产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。@Bean明确地指示了一种方法,什么方法呢?产生一个bean的方法,并且交给Spring容器管理;从这我们就明白了为啥@Bean是放在方法的注释上了,因为它很明确地告诉被注释的方法,你给我产生一个Bean,然后交给Spring容器,剩下的你就别管了。@Bean就放在方法上,就是让方法去产生一个Bean,然后交给Spring容器。
@Configuration
public class MyConfig {
@Bean
public User user() {
User user = new User();
user.setCat(cat());
return user;
}
@Bean
public Cat cat() {
return new Cat();
}
}
@Configuration
注解用于定义配置类,替换xml文件,通常搭配@Bean
使用
spring5.2之后新增lite模式Full模式和Lite模式是针对spring配置而言的,和xml配置无关。
@Component
注解@ComponentScan
注解@Import
注解@ImportResource
注解@Bean
方法@Configuration(proxyBeanMethods = false)
注解Lite总结:运行时不用生成CGLIB子类,提高运行性能,降低启动时间,可以作为普通类使用。但是不能声明@Bean之间的依赖
@Configuration
或者@Configuration(proxyBeanMethods = true)
的类被称为Full模式的配置类Full模式总结:单例模式能有效避免Lite模式下的错误。性能没有Lite模式好
上面的代码中user组件依赖了cat组件,此时@Configuration(proxyBeanMethods = true)
@Import
注解@import
(User.class,Cat.class,MyImportSelector.class): 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
public class MyImportSelector implements ImportSelector {
/**
* 可以返回空数组,返回null会报空指针异常
*
* @param importingClassMetadata:当前标注@Import注解的所有注解信息
* @return 返回值就是要导入容器组件的全类名
*/
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.jay.pojo.Blue","com.jay.pojo.Red"};
}
}
Conditional
注解按照条件装配,满足Conditional指定的条件,则进行组件注入,可以作用在类上和方法上,下图是改注解的衍生子类注解
@Configuration
@Import({MyImportSelector.class})
//表示当前spring容器中有cat时,在把该bean加到spring容器里面
@ConditionalOnBean(Cat.class)
public class MyConfig {
@Bean
public User user() {
return new User();
}
}
@ConfigurationProperties
注解配置绑定:读取配置文件中的内容
user:
name: "zhangsan"
age: 18
cat:
name: "tomcat"
age: 3
@EnableConfigurationProperties(User.class)
@Configuration
@EnableConfigurationProperties(User.class)
public class MyConfig {
}
@ConfigurationProperties(prefix = "user")
@ConfigurationProperties(prefix = "user")
public class User {
private String name;
private Integer age;
private Cat cat;
}
原文:https://www.cnblogs.com/kaimuxin/p/15004400.html