当前位置: 首页 > news >正文

Spring(二)——IoC

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

IoC(Inversion of Control)称之为控制反转,指的是在Spring框架的配置文件中声明对象,由框架负责创建对象,这叫做控制反转。实现方式有两种:

DI(Dependency Injection)依赖注入,这也是Spring框架的实现方式,主要学习的也是这个;

SL(Service Locator)服务器定位器实现方式

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

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

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

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

 

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

    1,当属性为简单字符串时,可以直接增加property标签:例如:
  private String usercode ;
  private String userpswd ;
 
    <bean id="loginAction" class="com.bjpowernode.struts2.action.LoginAction" >  
            <property name="usercode" value="admin"></property>  
            <property name="userpswd" value="admin"></property>  
    </bean>   
 
    2,属性值为引用类型时,通过property中的ref属性来关联对象:
    private UserService userService;

    <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >  
            <property name="userService" ref="userService"></property>  
     </bean>  
      
    <bean id="userService" class="com.ljh.struts2.service.UserService"></bean> 

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

    <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >  
                <property name="names" value="zhang,san,lisi,wangwu"></property>  
     </bean>  
 
     如果赋值操作中,需要将逗号作为一个整体,那么需要通过特殊的标签进行赋值
    <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >  
                <property name="userService" ref="userService"></property>  
                <property name="names">  
                    <list>  
                        <value>zhang,san</value>  
                        <value>lisi</value>  
                        <value>wangwu</value>                 
                    </list>  
                </property>  
      
    </bean> 


     4,属性为list集合时,也是使用list标签:
    集合如果使用泛型,只能存储相同类型的元素,不使用泛型,可以存储不同类型的元素:
  private List<String> nameList ;

    <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >  
                        <property name="nameList">  
                            <list>  
                                <value>zhang,san</value>  
                                <value>lisi</value>  
                                <value>wangwu</value>                 
                            </list>  
                        </property>  
      
    </bean>
 
     5,当属性为map集合时,需要使用map标签:
  Private Map map ;

    <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >  
                <property name="map">  
                    <map>  
                        <entry key="hello" value="world"></entry>  
                        <entry key-ref="userService" value-ref="userService"></entry>  
                    </map>  
                </property>  
     </bean>             
  
    <bean id="userService" class="com.ljh.struts2.service.UserService"></bean></span>  
 
     6,属性为Properties集合类型时,需要在设置属性值时,增加props标签
  private Properties props ; //继承了Hashtable,是线程安全的

    <bean id="loginAction" class="com.bjpowernode.struts2.action.LoginAction" >  
                    <property name="props">  
                        <props>  
                            <prop key="url">jdbc:oracle:thin:@192.168.1.27:1521:ljh</prop>  
                            <prop key="driverName">oracle.jdbc.driver.OracleDriver</prop>  
                            <prop key="username">scott</prop>  
                            <prop key="password">tiger</prop>  
                        </props>  
                    </property>  
      
    </bean>

 

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

 

       二,Constructor Injection

      1,例如我们声明了有参构造方法,就需要通过次构造方法进行创建对象和关联对象了,利用constructor-arg标签:
 
    //无参构造方法      
    public LoginAction(String usercode) {  
                super();  
                this.usercode = usercode;  
      
    }
 

    <!--  通过value属性指定其值-->  
     <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >  
            <constructor-arg value="admin"></constructor-arg>                 
     </bean>  

     2,如果我们有多个无参构造方法,里边参数可能不同,顺序可能不同等!怎么办呢?其中框架会根据制定的参数个数,type制定的类型,index制定的先后顺序来查找我们想要的构造方法,来进行初始化和对象关联。
 
    <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >  
                <constructor-arg value="admin" index="0"></constructor-arg>  
                <constructor-arg value="22" type="int" index="1"></constructor-arg>   
      
    </bean>
    
      3,构造方法和set方法同时使用也是可以的,它们两者的标签没有先后顺序问题,框架会先调用带参数的构造方法创建对象,然后构造注入数据,再调用set方法进行属性注入。但是自我感觉这种方法尽量少用。
 
    <bean id="loginAction" class="com.bjpowernode.struts2.action.LoginAction" >             
                <constructor-arg value="admin" index="0"></constructor-arg>       
                <constructor-arg value="23" type="int" index="1"></constructor-arg>  
                <property name="userpswd" value="admin"></property>   
      
    </bean>

 

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

            1,byName(根据名称),从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:表示不支持自动装配功能;
 
          6,default:表示默认采用上一级标签的自动装配的取值。<beans>标签中的default-autowire属性。如果存在多个配置文件的话,那么每一个配置文件的自动装配方式都是独立的。

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

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


转载于:https://my.oschina.net/huangcongcong/blog/528547

相关文章:

  • SQl语句收藏
  • 采药
  • js常用正则表达式
  • 学生——成绩表2.3
  • SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息
  • 第2章番外 Java的命名规范
  • 基于清单的启动器的实现
  • linux运维实战练习-2015年11月8日-11月17日课程作业(练习)汇总
  • 使用netstat命令查看并发连接数
  • Visio中如何画面积一样的形状
  • SIP进行时
  • 有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果(转)...
  • 实习小白::(转) Cocos2d-x 3.0 开发(十二)在CocoStudio中使用粒子挂载与曲线动画...
  • 高焕堂讲Android核心
  • python对象的创建和销毁
  • android图片蒙层
  • CSS实用技巧干货
  • Docker入门(二) - Dockerfile
  • Fabric架构演变之路
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Koa2 之文件上传下载
  • Node + FFmpeg 实现Canvas动画导出视频
  • PaddlePaddle-GitHub的正确打开姿势
  • ReactNativeweexDeviceOne对比
  • Swoft 源码剖析 - 代码自动更新机制
  • zookeeper系列(七)实战分布式命名服务
  • 机器学习 vs. 深度学习
  • 开发基于以太坊智能合约的DApp
  • 如何利用MongoDB打造TOP榜小程序
  • 使用SAX解析XML
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • const的用法,特别是用在函数前面与后面的区别
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​人工智能书单(数学基础篇)
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)拼包函数及网络封包的异常处理(含代码)
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET BackgroundWorker
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET基础篇——反射的奥妙
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [flask]http请求//获取请求体数据
  • [Java基础]—JDBC