zoukankan      html  css  js  c++  java
  • Spring常用注解简析

    1. Autowired
      自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。
      @Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当且仅一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。
      当Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去。
      @Autowired(required=false) 这时找不到bean,Spring容器不再抛出异常而是认为bean为null。

    2. Qualifier(指定注入Bean的名称)
      如果容器中一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称,看下面的例子:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        ">
        
        <context:component-scan base-package="com.spring" />
        
        <!-- Autowired注解配合Qualifier注解 -->
        <bean id="animal" class="com.spring.model.Animal" />
        <bean id="donkey" class="com.spring.service.impl.Donkey" />
        <bean id="monkey" class="com.spring.service.impl.Monkey" />
        
    </beans> 

    这时xml文件中配置了两个bean(donkey,monkey), 如果Autowired未指定具体类名时,Animal接口会加载两个bean, 但接口只有一个实现类,就会报错。出现这种情况通常两种解决办法:
      (1) 在配置文件中删除其中一个实现类,Spring会自动去base-package下寻找Animal接口的实现类,发现Animal接口只有一个实现类,便会直接引用这个实现类。
      (2) 实现类就是有多个该怎么办?此时可以使用@Qualifier注解来指定Bean的名称,如下:

    public class CarFactory {
        @Autowired
        @Qualifier("monkey")
        private Animal animal;
     
        public String toString(){
            return car.getAnimalName();
        }
    } 

    此处会注入名为"monkey"的Bean。

    3. Resource
    @Resource注解与@Autowired注解作用非常相似,其装配顺序如下:
      (1) @Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
      (2) 指定了name或者type则根据指定的类型去匹配bean
      (3) 指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

    @Autowired和@Resource两个注解的区别:
      (1) @Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
      (2) @Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了
    Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

    4. Component
    @Component是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。

    5. Controller
    @Controller对应表现层的Bean,也就是Action,例如:

    @Controller
    @Scope("prototype")
    public class UserAction extends BaseAction<User>{
       ……
    }
    

      使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为"userAction"的action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,则使用value作为bean的名字。
      这里的UserAction还使用了@Scope注解,@Scope("prototype")表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope 是单例模式(scope="singleton"),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope="prototype" 可以保证当请求的时候都创建一个Action对象。

    6. Service
    @Service对应的是业务层Bean,例如:

    @Service("userService")
    public class UserServiceImpl implements UserService {
      ………
    }
    

       @Service("userService")注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做"userService",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注入给Action:在Action只需要声明一个名字叫"userService"的变量来接收由Spring注入的"userService"即可,具体代码如下:

    @Resource(name = "userService")
    private UserService userService;
    

     注意:

      在Action声明的"userService"变量的类型必须是"UserServiceImpl"或者是其父类"UserService",否则由于类型不一致而无法注入.

      由于Action中的声明的"userService"变量使用了@Resource注解去标注,并且指明了其name = "userService",这就等于告诉Spring,说我Action要实例化一个"userService",你Spring快点帮我实例化好,然后给我,
    当Spring看到userService变量上的@Resource的注解时,根据其指明的name属性可以知道,Action中需要用到一个UserServiceImpl的实例,此时Spring就会把自己创建好的名字叫做"userService"的UserServiceImpl的实例注入给Action中的"userService"变量,帮助Action完成userService的实例化,这样在Action中就不用通过"UserService userService = new UserServiceImpl();"这种最原始的方式去实例化userService了。
      如果没有Spring,那么当Action需要使用UserServiceImpl时,必须通过"UserService userService = new UserServiceImpl();"主动去创建实例对象,但使用了Spring之后,Action要使用UserServiceImpl时,创建UserServiceImpl实例已经交给Spring来做了,Spring把创建好的UserServiceImpl实例给Action,Action拿到就可以直接用了。
    Action由原来的主动创建UserServiceImpl实例后就可以马上使用,变成了被动等待由Spring创建好UserServiceImpl实例之后再注入给Action,Action才能够使用。这说明Action对"UserServiceImpl"类的“控制权”已经被“反转”了,原来主动权在自己手上,自己要使用"UserServiceImpl"类的实例,自己主动去new一个出来马上就可以使用了,但现在自己不能主动去new "UserServiceImpl"类的实例,new "UserServiceImpl"类的实例的权力已经被Spring拿走了,只有Spring才能够new "UserServiceImpl"类的实例,而Action只能等Spring创建好"UserServiceImpl"类的实例后,再“恳求”Spring把创建好的"UserServiceImpl"类的实例给它,这样它才能够使用"UserServiceImpl",这就是Spring核心思想“控制反转”,也叫“依赖注入”,“依赖注入”也很好理解,Action需要使用UserServiceImpl干活,那么就是对UserServiceImpl产生了依赖,Spring把Acion需要依赖的UserServiceImpl注入(也就是“给”)给Action,这就是所谓的“依赖注入”。对Action而言,Action依赖什么东西,就请求Spring注入给它,对Spring而言,Action需要什么,Spring就主动注入给它。

    7. Repository

    @Repository对应数据访问层Bean ,例如:

    @Repository(value="userDao")
    public class UserDaoImpl extends BaseDaoImpl<User> {
       ………
    }
    

    @Repository(value="userDao")注解是告诉Spring,让Spring创建一个名字叫"userDao"的UserDaoImpl实例。

    当Service需要使用Spring创建的名字叫"userDao"的UserDaoImpl实例时,就可以使用@Resource(name = "userDao")注解告诉Spring,Spring把创建好的userDao注入给Service即可。如下:

    @Resource(name = "userDao")
    private BaseDao<User> userDao;
    

    8. 其他注解:
    @Configuration: 把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
    @Scope:注解作用域
    @Lazy(true): 表示延迟初始化
    @Component: 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
    @Scope: 用于指定scope作用域的(用在类上)
    @PostConstruct: 用于指定初始化方法(用在方法上)
    @PreDestory: 用于指定销毁方法(用在方法上)
    @DependsOn:定义Bean初始化及销毁时的顺序
    @Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
    @Resource:默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
    @PostConstruct: 初始化注解
    @PreDestroy : 摧毁注解,默认单例,启动就加载
    @Async: 异步方法调用

  • 相关阅读:
    ASP.NET Web API 框架研究 Self Host模式下的消息处理管道
    ASP.NET Web API 框架研究 Web Host模式下的消息处理管道
    ASP.NET Web API 框架研究 核心的消息处理管道
    ASP.NET Web API 框架研究 Web Host模式路由及将请求转出到消息处理管道
    ASP.NET Web API 框架研究 ASP.NET Web API 路由
    ASP.NET Web API 框架研究 ASP.NET 路由
    ASP.NET Web API 入门 (API接口、寄宿方式、HttpClient调用)
    MVVM模式
    RESTful Web API 理解
    C# 函数式编程及Monads.net库
  • 原文地址:https://www.cnblogs.com/hunterCecil/p/8302478.html
Copyright © 2011-2022 走看看