@Autowired,@Bean和@Component
@Autowired
- 作用:自动按照类型注入。只要容器中有唯一的一个bean对象要和注入的变量类型匹配,就可以注入成功
- 出现位置:
- 变量上
- 方法上
- 注意:
- 如果ioc容器中有多个类型匹配时:会先找数据类型,然后根据变量名称匹配。
- 如果ioc容器中没有任何类型bean和要注入的数据类型匹配(或类型匹配但变量名称不匹配),则报错
作用在变量上
@Service
public class AccountServiceImpl implements IAccountService {
@Autowired//自动按照类型注入
private IAccountDao accountdao;
public void saveAccount() {
//不需要再new了 大大降低了程序间的耦合
//此处不懂可以去研究SpringIOC的原理
accountdao.saveAccount();
}
}
作用在方法上
- 该方法如果有参数,会使用
@autowired
的方式在容器中查找是否有该参数
@Service
public class AccountServiceImpl implements IAccountService {
@Autowired
public void setRedisTemplate(RedisTemplate redisTemplate) {
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
this.redisTemplate = redisTemplate;
}
}
- 注意
- spring容器会在类加载后自动注入这个方法的参数,并执行一遍方法。
- 这就像static{}块语句会初始化执行,但顺序不一样。static{}更快
@Component
-
作用
- 此注解修饰的类就会被Spring扫描到并注入到Spring的bean容器中
-
出现位置
- 接口、类、枚举、注解
-
注意
@Controller
注解的bean会被spring-mvc框架所使用。@Repository
会被作为持久层操作(数据库)的bean来使用@Component
是自定义能力最好的注解
-
细节
@Component
就是跟<bean>
一样,可以托管到Spring容器进行管理。@Service
,@Controller
,@Repository
= {@Component
+ 一些特定的功能}。这个就意味着这些注解在部分功能上是一样的。- 此4个注解功能一样,仅名字不同,但能够区分层次,代码之间的调用也清晰明朗,便于项目的管理
@Bean
- 作用
- @Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名
- 出现的位置
- 方法、注解
定义Bean
下面是@Configuration里的一个例子
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
这个配置就等同于在xml里的配置
<beans>
<bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>
总结
-
@Component就是把这个类注册进Spring容器中管理
-
如果类没注册进Spring容器中,那么@Bean和@Autowired统统都会失效
-
@Bean就是这个方法返回的对象,放入Spring容器中进行管理
-
@Autowired就是从Spring容器中拿对象,如果没有就报错
具体可以参考此优秀博文
参考
http://bcxw.net/article/53.html
https://www.jianshu.com/p/3fbfbb843b63
http://www.tomaszezula.com/2014/02/09/spring-series-part-5-component-vs-bean/
https://www.cnblogs.com/duanxz/p/7493276.html