zoukankan      html  css  js  c++  java
  • @Autowired @Resource用法

    @Autowired的用法和作用

    这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。

    <bean id="userDao"class="..."/>

    <bean id="userService"class="...">

       <property name="userDao">

         <ref bean="userDao"/>

       </property>

    </bean>

    这样你在userService里面要做一个userDao的setter/getter方法。

    但如果你用了@Autowired的话,你只需要在UserService的实现类中声明即可。

    @Autowired

    private IUserDao userdao;

    Spring@Autowired注解与自动装配

    1   配置文件的方法

    我们编写spring 框架的代码时候。一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量。并且要配套写上 get 和 set方法。

    Boss 拥有 Office 和 Car 类型的两个属性:  

    3. Boss.java

    public class Boss {    

       private Car car;    

       private Office office;    

       

       // 省略 get/setter     

       

       @Override   

       public String toString() {    

           return "car:" + car + "/n" + "office:" +office;    

       }    

    }    

    我们在 Spring 容器中将 Office 和 Car 声明为 Bean,并注入到 Boss Bean 中:下面是使用传统 XML 完成这个工作的配置文件 beans.xml:  

    beans.xml 将以上三个类配置成 Bean                    

    <?xml version="1.0"encoding="UTF-8" ?>    

    <beansxmlns="http://www.springframework.org/schema/beans"   

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   

       xsi:schemaLocation="http://www.springframework.org/schema/beans     

    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">    

       <bean id="boss" class="Boss">    

           <property name="car" ref="car"/>    

           <property name="office" ref="office" />    

       </bean>    

       <bean id="office" class="Office">    

           <property name="officeNo" value="002"/>    

       </bean>    

       <bean id="car" class="Car"scope="singleton">    

            <property name="brand"value=" 红旗 CA72"/>    

           <property name="price" value="2000"/>    

       </bean>    

    </beans>    

    当我们运行以下代码时,控制台将正确打出 boss 的信息:  

    清单 5. 测试类:AnnoIoCTest.java  

           

    import org.springframework.context.ApplicationContext;    

    importorg.springframework.context.support.ClassPathXmlApplicationContext;    

    public class AnnoIoCTest {    

       

       public static void main(String[] args) {    

           String[] locations = {"beans.xml"};    

           ApplicationContext ctx =     

               new ClassPathXmlApplicationContext(locations);    

           Boss boss = (Boss) ctx.getBean("boss");    

           System.out.println(boss);    

       }    

    }    

         

    这说明 Spring 容器已经正确完成了 Bean 创建和装配的工作。  

    2. @Autowired

    Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。通过 @Autowired的使用来消除 set ,get方法。

    要实现我们要精简程序的目的。需要这样来处理:

    在applicationContext.xml中加入:

    <!-- 该 BeanPostProcessor 将自动对标注@Autowired 的 Bean 进行注入 -->    

     <beanclass="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> 

    Spring 通过一个BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。  

    修改在原来注入spirng容器中的bean的方法。

    在域变量上加上标签@Autowired,并且去掉相应的get 和set方法

    使用 @Autowired 注释的 Boss.java  

                      

    importorg.springframework.beans.factory.annotation.Autowired;    

       

    public class Boss {    

       @Autowired   

       private Car car;    

       

       @Autowired   

       private Office office; 

    }     

    在applicatonContext.xml中把原来 引用的<porpery>标签也去掉。

    <?xml version="1.0"encoding="UTF-8" ?>    

    <beansxmlns="http://www.springframework.org/schema/beans"   

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   

       xsi:schemaLocation="http://www.springframework.org/schema/beans     

    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">    

       

       <!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 -->    

       <bean class="org.springframework.beans.factory.annotation.    

           AutowiredAnnotationBeanPostProcessor"/>    

       

       <!-- 移除 boss Bean 的属性注入配置的信息 -->     

       <bean id="boss" class="Boss"/>    

         

       <bean id="office" class="Office">    

           <property name="officeNo" value="001"/>    

       </bean>    

       <bean id="car" class=" Car"scope="singleton">    

           <property name="brand" value=" 红旗CA72"/>    

           <property name="price" value="2000"/>    

       </bean>    

    </beans>   

     这样,当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有 @Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。  

    按照上面的配置,Spring 将直接采用 Java 反射机制对 Boss 中的 car 和 office 这两个私有成员变量进行自动注入。所以对成员变量使用 @Autowired 后,您大可将它们的 setter 方法(setCar() 和 setOffice())从 Boss 中删除。  

    当然,您也可以通过 @Autowired 对方法或构造函数进行标注,如果构造函数有两个入参,分别是 bean1 和 bean2,@Autowired 将分别寻找和它们类型匹配的 Bean,将它们作为 CountryService (Bean1 bean1 ,Bean2 bean2) 的入参来创建CountryService Bean。来看下面的对方法

    public class Boss {    

       private Car car;    

       private Office office;    

       

        @Autowired    

       public void setCar(Car car) {    

           this.car = car;    

       }    

         

       @Autowired   

       public void setOffice(Office office) {    

           this.office = office;    

       }    

       …    

    }    

    这时,@Autowired 将查找被标注的方法的入参类型的 Bean,并调用方法自动注入这些 Bean。而下面的使用方法则对构造函数进行标注:     

       

    public class Boss {    

       private Car car;    

       private Office office;    

         

       @Autowired   

       public Boss(Car car ,Office office){    

           this.car = car;    

           this.office = office ;    

       }   

    }    

    由于 Boss() 构造函数有两个入参,分别是 car 和 office,@Autowired 将分别寻找和它们类型匹配的 Bean,将它们作为 Boss(Car car ,Office office) 的入参来创建 Boss Bean。  

    @Resource的作用和用法

    @Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面 @Resource 默认按 byName自动注入罢了。

    @Resource 有两个属性是比较重要的,分别是 name和 type,Spring将 @Resource 注释的 name属性解析为 Bean的名字,

    而 type属性则解析为 Bean的类型。所以如果使用 name属性,则使用 byName的自动注入策略,而使用 type属性时则使用 byType

    自动注入策略。如果既不指定 name也不指定 type属性,这时将通过反射机制使用 byName自动注入策略。
    Resource 注释类位于 Spring发布包的 lib/j2ee/common-annotations.jar类包中,因此在使用之前必须将其加入到项目的类库中。

    来看一个使用 @Resource 的例子:

    使用 @Resource注释的 Boss.java

    importjavax.annotation.Resource;

    public class Boss{   

    // 自动注入类型为 Car 的 Bean   

    @Resource   

    private Car car;    // 自动注入 bean 名称为 office 的 Bean   

    @Resource(name = "office")   

    private Office office;

    }

    一般情况下,我们无需使用类似于 @Resource(type=Car.class) 的注释方式,因为 Bean 的类型信息可以通过 Java反射从代码中获取。
    要让 JSR-250 的注释生效,除了在 Bean 类中标注这些注释外,还需要在 Spring容器中注册一个负责处理这些注释的BeanPostProcessor:

    <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>

    CommonAnnotationBeanPostProcessor 实现了 BeanPostProcessor 接口,它负责扫描使用了 JSR-250 注释的 Bean,并对它们进行相应的操作。

  • 相关阅读:
    Nodejs下载和第一个Nodejs示例
    永久关闭Win10工具栏的TaskbarSearch控件
    对称加密,非对称加密,散列算法,签名算法
    【转】TTL和RS232之间的详细对比
    zlg核心板linux系统中查看系统内存等使用信息
    Power BI后台自动刷新数据报错 The operation was throttled by Power BI Premium because there were too many datasets being processed concurrently.
    剪切板和上传文件内容获取
    CSS, LESS, SCSS, SASS总结
    文字程序
    electron 打包“ERR_ELECTRON_BUILDER_CANNOT_EXECUTE”
  • 原文地址:https://www.cnblogs.com/lijia0511/p/5751883.html
Copyright © 2011-2022 走看看