从广义上Spring注解可以分为两类:
1、一类注解是用于注册Bean
假如IOC容器就是一间空屋子,首先这间空屋子啥都没有,我们要吃大餐,我们就要从外部搬运食材和餐具进来。这里把某一样食材或者某一样餐具搬进空屋子的操作就相当于每个注册Bean的注解作用类似。
注册Bean的注解作用就是往IOC容器中放(注册)东西!
用于注册Bean的注解: 比如@Component , @Repository , @ Controller , @Service , @Configration,这些注解就是用于注册Bean,放进IOC容器中,一来交给spring管理方便解耦,二来还可以进行二次使用。
那么什么是二次使用呢?这里的二次使用可以理解为:在你开始从外部搬运食材和餐具进空屋子的时候,一次性搬运了猪肉、羊肉、铁勺、筷子四样东西,这个时候你要开始吃大餐,首先你吃东西的时候肯定要用筷子或者铁勺,别说你手抓,只要你需要,你就会去找,这个时候发现你已经把筷子或者铁勺放进了屋子,你就不用再去外部拿筷子进屋子了,意思就是IOC容器中已经存在,就可以直接拿去用,而不必再去注册!
而拿屋子里已有的东西的操作就是下面要讲的用于使用Bean的注解。
2、另一类注解是用于使用Bean
用于使用Bean的注解:比如@Autowired、@Resource注解,这些注解就是把屋子里的东西直接拿来用。
如果你要拿,前提一定是屋子(IOC容器)里有的,不然就会报错,比如你要做一道牛肉拼盘,需要五头牛做原材料才行,你现在锅里只有四头牛,这个时候你知道,自己往屋子里搬过五头牛,这个时候就直接把屋子里的那头牛直接放进锅里,完成牛肉拼盘的组装。
这些注解就是需要啥想要啥,只要容器中有就往容器中拿!而这些注解又有各自的区别:比如@Autowired用在筷子上,这筷子你可能只想用木质的,或许只想用铁质的,@Autowired作用在什么属性的筷子就那什么筷子,而@Resource如果用在安格斯牛肉上面,就指定要名字就是安格斯牛肉的牛肉。
3、总结:
使用Bean的注解,就是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;
而注册Bean的注解,比如:@Component , @Repository , @ Controller , @Service , @Configration,就是把你要实例化的对象转化成一个Bean,放在IOC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。
@Bean这个注解属于用于注册Bean的注解。
@Bean 就放在方法上,其作用就是让方法去产生一个 Bean,然后交给Spring容器。
产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
Spring的@Bean注解明确的指示了一个方法,什么方法呢 —— 产生一个 Bean 的方法,并且交给 Spring 容器去管理。从这我们就明白了为啥 @Bean 是放在方法上了,因为它明确的告诉了被注解的方法,你给我产生一个Bean,然后交给Spring容器,剩下的你就不用管了。
如下就能让accountDao方法产生一个 AccountDao 对象,然后这个AccountDao 对象交给Spring管理
class A{
@Bean
public AccountDao accountDao(){
return new AccountDao();
}
}
实际上,@Bean注解和xml配置中的bean标签的作用是一样的。
不知道大家有没有想过,用于注册Bean的注解的有那么多个,为何还要出现@Bean注解?
原因很简单:类似@Component , @Repository , @ Controller , @Service 这些注册Bean的注解存在局限性,只能局限作用于自己编写的类,如果是一个jar包第三方库要加入IOC容器的话,这些注解就手无缚鸡之力了。
是的,@Bean注解就可以做到这一点。
当然除了@Bean注解能做到外,还有@Import也能把第三方库中的类实例交给spring管理,而且@Import更加方便快捷。
使用@Bean注解的另一个好处就是能够动态获取一个Bean对象,能够根据环境不同得到不同的Bean对象。
1、Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。 产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
2、@Component , @Repository , @ Controller , @Service 这些注解只局限于自己编写的类,而@Bean注解能把第三方库中的类实例加入IOC容器中并交给spring管理。
3、@Bean注解的另一个好处就是能够动态获取一个Bean对象,能够根据环境不同得到不同的Bean对象。
4、记住:@Bean就放在方法上,就是让方法去产生一个Bean,然后交给Spring容器,剩下的你就别管了。
原文:https://www.cnblogs.com/goloving/p/14926322.html