@Controller:控制器(注入服务)---标注在控制层;(标注控制层组件)
@Service:业务逻辑、服务(注入service或dao)---标注于业务层;
@Repository:实现dao的访问(注入dao的实现层impl)---标注于数据访问层,即dao层;(标注数据访问组件,即DAO组件)
@Component:把普通的POJO实例化到Spring容器中,相当于配置文件中的<bean id="" class="">---不好归类则使用该注解标注;(当组件不好归类的时候,我们可以使用这个注解进行标注。)
<bean id="executor" class="com.alipay.ThreadPoolTask">
以上四个注解是将它注解的类纳入Spring容器中管理。
引入component的扫描组件的写法
<context:component-scan base-package="com.demo.util"/>
<context:component-scan base-package="com.demo.test"/>
<context:component-scan base-package="com.quartz.redis.test"/>
@Autowired和@Resource的区别:
(1)@Autowired与@Resource都可以用来装配bean.都可以写在字段上,或者写在setter方法上。
(2)@Autowired默认按类型装配(该注解是属于Spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false.( @Autowired (required=false) ).如果我们想使用名称装配可以结合 @Qualifier 注解进行使用;
注:@Autowired和@Resource使用方面不推荐@Autowired,推荐使用@Resource。
@Autowired:
@Autowired可以对成员变量、方法和构造函数进行标注来完成自动装配的工作。@Autowired的标注位置不同,它们都会在Spring在初始化这个bean的时候自动装配这个属性。要让@Autowired能够起作用,还要在配置文件中加入xml代码配置如下;
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
@Qualifier:
@Autowired是根据类型进行自动装配。如果当Spring上下文中存在多个"channelandcommerce"类型的bean时,就会抛出BeanCreationExceptionyi异常;如果Spring上下文中不存在"channelandcommerce"类型的bean,也会抛出该异常。因此我们可以使用@qualifier来解决这些问题。
例如:
@Autowired
public void setGlobalCache(@Qualifier("channelandcommerce") Ehcache channelandcommerce){
this.channelandcommerce = channelandcommerce;
}
@Resource:
@Resource相当于@Autowired的作用,只是@Autowired默认是byType自动注入,而@Resource默认是byName自动注入。@Resource有两个相当重要的属性name和type;Spring将@Resource的name属性解析为bean的name;type属性解析为bean的type;所以如果使用name属性则使用byName自动注入策略,反之使用type属性则使用byType自动注入策略。如果name属性和type属性都不指定,则将通过反射机制使用buName自动注入。
@Resource(name = "shiroPwdEncoder")
private PwdEncoder pwdEncoder;
比如此处使用name属性将"shiroPwdEncoder"这个bean自动注入进去。
@Resource装配顺序:
a.如果同时指定了name和type属性,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛异常;
b.如果只是指定了name,则从Spring上下文中找名称(id=“name”)匹配的bean进行装配,找不到则抛异常;
c.如果只是指定了type,则从Spring上下文中找到类型匹配的唯一的bean进行装配,找不到或者找出多个则都要抛异常;
d.如果name和type两个都没有指定,则自动按byName自动注入策略进行装配;
@Scope:
在使用配置文件定义Bean时,我们可能还需要通过bean的scope属性来定义bean的作用范围,此时可以用@Scope注解来完成这个功能:
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)