分享

Spring(二)

 风吹乱了流年 2016-10-15

               IoCInversion of Control)称之为控制反转,指的是在spring框架的配置文件中声明对象,由框架负责创建对象,这叫做控制反转。实现方式有两种:DI(Dependency Injection)依赖注入,这也是Spring框架的实现方式,主要学习的也是这个;SLService Locator)服务器定位器实现方式。


              DI依赖注入,就是框架不仅创建了对象,而其还负责初始化相关联的对象的过程。从实现方式上也分为3种方式:


                      a,Interface Injection(接口注入):容器运行时,目标对象实现特定的接口,然后容器通过接口将关联对象注入到目标对象中。这种方式Spring框架不支持,所以了解。


                     b,Setter Injection(set方法注入):容器运行时,通过类属性的set方法将关联对象注入到目标对象中。Spring框架支持,而且是我们开发经常使用的,非常重要。


                     c,Constructor Injection(构造方法注入):容器运行时,通过类的构造方法将关联对象注入到对象中。Spring框架也支持,没有set用的普遍。

 

   好,下边主要总结一下set方法注入和构造方法注入。

 

一,Setter Injection:


    1,当属性为简单字符串时,可以直接增加property标签:例如:

privateString usercode ;

privateString userpswd ;

 

setter方法: 是配置文件中property标签的name属性值的set方法


  1. <span style="font-size:18px;">          <bean id="loginAction" class="com.bjpowernode.struts2.action.LoginAction" >  
  2.                 <property name="usercode" value="admin"></property>  
  3.                 <property name="userpswd" value="admin"></property>  
  4.             </bean>  
  5. </span>  


 

          2,属性值为引用类型时,通过property中的ref属性来关联对象:

   privateUserService userService;

 

   setter方法

  1. <span style="font-size:18px;">  <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >  
  2.         <property name="userService" ref="userService"></property>  
  3.     </bean>  
  4.   
  5. <bean id="userService" class="com.ljh.struts2.service.UserService"></bean>  </span>  


         3,属性为数组类型时,需要在设置属性值时,将多个元素通过逗号隔开,或者利用list标签:

privateString[] names ;

 

setter方法

  1. <span style="font-size:18px;">      <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >  
  2.             <property name="names" value="zhang,san,lisi,wangwu"></property>  
  3.         </bean>  
  4. </span>  

如果赋值操作中,需要将逗号作为一个整体,那么需要通过特殊的标签进行赋值

  1. <span style="font-size:18px;">      <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >  
  2.             <property name="userService" ref="userService"></property>  
  3.             <property name="names">  
  4.                 <list>  
  5.                     <value>zhang,san</value>  
  6.                     <value>lisi</value>  
  7.                     <value>wangwu</value>                 
  8.                 </list>  
  9.             </property>  
  10.   
  11. </bean></span>  


             4,属性为list集合时,也是使用list标签:

集合如果使用泛型,只能存储相同类型的元素,不使用泛型,可以存储不同类型的元素:

privateList<String> nameList ;

 

setter方法

  1. <span style="font-size:18px;">              <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >  
  2.                     <property name="nameList">  
  3.                         <list>  
  4.                             <value>zhang,san</value>  
  5.                             <value>lisi</value>  
  6.                             <value>wangwu</value>                 
  7.                         </list>  
  8.                     </property>  
  9.   
  10. </bean>   </span>  

             5,当属性为map集合时,需要使用map标签:

Private Map map ;

 

setter方法

  1. <span style="font-size:18px;">      <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >  
  2.             <property name="map">  
  3.                 <map>  
  4.                     <entry key="hello" value="world"></entry>  
  5.                     <entry key-ref="userService" value-ref="userService"></entry>  
  6.                 </map>  
  7.             </property>  
  8.         </bean>             
  9.   
  10. <bean id="userService" class="com.ljh.struts2.service.UserService"></bean></span>  

              6,属性为Properties集合类型时,需要在设置属性值时,增加props标签

 

privateProperties props ; //继承了Hashtable,是线程安全的

 

setter方法

  1. <span style="font-size:18px;">          <bean id="loginAction" class="com.bjpowernode.struts2.action.LoginAction" >  
  2.                 <property name="props">  
  3.                     <props>  
  4.                         <prop key="url">jdbc:oracle:thin:@192.168.1.27:1521:ljh</prop>  
  5.                         <prop key="driverName">oracle.jdbc.driver.OracleDriver</prop>  
  6.                         <prop key="username">scott</prop>  
  7.                         <prop key="password">tiger</prop>  
  8.                     </props>  
  9.                 </property>  
  10.   
  11. </bean></span>  

     总结:以上为几种常用属性类型的set注入的写法,set方法注入,框架是先通过默认的无参构造方法进行创建对象,然后进行set注入的。当然如果我们重写了构造方法,没有了无参构造呢?这就需要下边的构造方法注入了。

 

 

       二,Constructor Injection


               1,例如我们声明了有参构造方法,就需要通过次构造方法进行创建对象和关联对象了,利用constructor-arg标签:


  1. <span style="font-size:18px;">//无参构造方法      public LoginAction(String usercode) {  
  2.             super();  
  3.             this.usercode = usercode;  
  4.   
  5. }</span>  


  1. <span style="font-size:18px;">      <!--  通过value属性指定其值-->  
  2.         <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >  
  3.             <constructor-arg value="admin"></constructor-arg>                 
  4.         </bean>  
  5. </span>  

          2,如果我们有多个无参构造方法,里边参数可能不同,顺序可能不同等!怎么办呢?其中框架会根据制定的参数个数,type制定的类型,index制定的先后顺序来查找我们想要的构造方法,来进行初始化和对象关联。


  1. <span style="font-size:18px;">      <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >  
  2.             <constructor-arg value="admin" index="0"></constructor-arg>  
  3.             <constructor-arg value="22" type="int" index="1"></constructor-arg>   
  4.   
  5. </bean></span>  


          3,构造方法和set方法同时使用也是可以的,它们两者的标签没有先后顺序问题,框架会先调用带参数的构造方法创建对象,然后构造注入数据,再调用set方法进行属性注入。但是自我感觉这种方法尽量少用。


  1. <span style="font-size:18px;">      <bean id="loginAction" class="com.bjpowernode.struts2.action.LoginAction" >             
  2.             <constructor-arg value="admin" index="0"></constructor-arg>       
  3.             <constructor-arg value="23" type="int" index="1"></constructor-arg>  
  4.             <property name="userpswd" value="admin"></property>   
  5.   
  6. </bean>   </span>  



          三,自动装配功能,就是框架会自动为我们匹配,利用autowire标签来实现,注意这种自动装配功能不支持简单类型(String,intdate等)他有6个值byName,byType,constructor,autodetect,no,default。从字面类型大概看个差不多吧。简单说一下。


            1byName(根据名称),从Spring环境中获取目标对象时,目标对象中的属性会根据名称在整个Spring环境中查找<bean>标签的id属性值:

<bean id="loginAction"class="com.ljh.struts2.action.LoginAction"autowire="byName" ></bean>

 

           2.byType(根据类型),从Spring环境中获取目标对象时,目标对象中的属性会根据类型在整个spring环境中查找<bean>标签的class属性值:

<bean id="userService"class="com.ljh.struts2.service.UserService"autowire="byType" ></bean>

 

           3, constructor:使用构造方法完成对象注入,其实也是根据构造方法的参数类型进行对象查找,相当于采用byType的方式。

 

           4,autodetect(自动选择):如果对象没有无参数的构造方法,那么自动选择constructor的自动装配方式进行构造注入。      如果对象含有无参数的构造方法,那么自动选择byType的自动装配方式进行setter注入。

 

          5,no:表示不支持自动装配功能;

 

          6default:表示默认采用上一级标签的自动装配的取值。<beans>标签中的default-autowire属性。如果存在多个配置文件的话,那么每一个配置文件的自动装配方式都是独立的。

     

          分析总结,自动装配就是为了弥补手动装配,如果两者都使用,优先选择手动的。由于自动装配需要在Spring全局环境中搜索,所以性能上会低一些,而且可阅读性较差,所以还是推荐大家使用手动装配功能。

 

 

         综上为Spring框架IOC的基础功能,这样Spring对对象的管理,对彼此之间的解耦起到了非常大的作用,使其优秀的重要条件之一。



   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多