zoukankan      html  css  js  c++  java
  • 《一头扎进Spring4》学习笔记(二)Spring 之 ioc 详解

    第一节 Spring ioc 简介

    IOC(控制反转:Inverse of Control),又称作 依赖注入,是一种重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。

    第二节 Spring ico 实例

    1、接口类

    1 public interface Tester {
    2   public void test();
    3 }

    2、实体类继承接口类

     1 public class Lisi implements Tester{
     2     public void test(){
     3         System.out.println("李四-测试程序");
     4     }
     5 }
     6 
     7 public class ZhangSan implements Tester{
     8     public void test(){
     9         System.out.println("张三-测试程序");
    10     }
    11 }        

    3、控制类

    public class JavaWork {
        
        private Tester tester;
        
        public void setTester(Tester tester) {
            this.tester = tester;
        }
    
        public void doTest(){        
            tester.test();
        }
    }

    4、beans.xml,Spring管理bean

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="http://www.springframework.org/schema/beans
     5         http://www.springframework.org/schema/beans/spring-beans.xsd">
     6 
     7     <bean id="zhangsan" class="com.java1234.service.ZhangSan"></bean>
     8     
     9     <bean id="lisi" class="com.java1234.service.Lisi"></bean>
    10     
    11     <bean id="javaWork" class="com.java1234.service.JavaWork">
    12         <property name="tester" ref="lisi"></property>
    13     </bean>
    14   
    15 </beans>

    property标签设置参数,ref 设置会自动调用JavaWork的set方法给tester赋值

    5、测试类

    1 public class Test2 {
    2   
    3     public static void main(String[] args) {
    4         ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
    5         JavaWork javaWork=(JavaWork)ac.getBean("javaWork");
    6         javaWork.doTest();
    7     }
    8 }

    第三节 装配一个bean 

    第四节 依赖注入

    1、属性注入

    2、构造函数注入(通过类型,通过索引,联合使用)

    3、工厂方法注入(非静态工厂,静态工厂)

    4、泛型依赖注入

    5、实例:

     

    实体类People

     1 package com.java1234.entity;
     2 
     3 public class People {
     4 
     5     private int id;
     6     private String name;
     7     private int age;
     8     
     9     public People() {
    10         super();
    11         // TODO Auto-generated constructor stub
    12     }
    13         
    14     public People(int id, String name, int age) {
    15         super();
    16         this.id = id;
    17         this.name = name;
    18         this.age = age;
    19     }
    20 
    21     public int getId() {
    22         return id;
    23     }
    24     public void setId(int id) {
    25         this.id = id;
    26     }
    27     public String getName() {
    28         return name;
    29     }
    30     public void setName(String name) {
    31         this.name = name;
    32     }
    33     public int getAge() {
    34         return age;
    35     }
    36     public void setAge(int age) {
    37         this.age = age;
    38     }
    39 
    40     @Override
    41     public String toString() {
    42         return "People [id=" + id + ", name=" + name + ", age=" + age + "]";
    43     }
    44     
    45 }

    非静态工厂类

     1 package com.java1234.factory;
     2 import com.java1234.entity.People;
     3 
     4 public class PeopleFactory {
     5 
     6     public People createPeople(){
     7         People p=new People();
     8         p.setId(5);
     9         p.setName("小七");
    10         p.setAge(77);
    11         return p;
    12     }
    13 }

    静态工厂类

     1 package com.java1234.factory;
     2 import com.java1234.entity.People;
     3 
     4 public class PeopleFactory2 {
     5 
     6     public static People createPeople(){
     7         People p=new People();
     8         p.setId(8);
     9         p.setName("小八");
    10         p.setAge(88);
    11         return p;
    12     }
    13 }

    beans.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="http://www.springframework.org/schema/beans
     5         http://www.springframework.org/schema/beans/spring-beans.xsd">
     6 
     7     <bean id="people" class="com.java1234.entity.People"></bean>
     8     
     9     <bean id="people2" class="com.java1234.entity.People">
    10         <property name="id" value="1"></property>
    11         <property name="name" value="张三"></property>
    12         <property name="age" value="11"></property>
    13     </bean>
    14     
    15     <bean id="people3" class="com.java1234.entity.People">
    16         <constructor-arg type="int" value="2"></constructor-arg>
    17         <constructor-arg type="String" value="李四"></constructor-arg>
    18         <constructor-arg type="int" value="22"></constructor-arg>
    19     </bean>
    20     
    21     <bean id="people4" class="com.java1234.entity.People">
    22         <constructor-arg index="0" value="3"></constructor-arg>
    23         <constructor-arg index="1" value="王五"></constructor-arg>
    24         <constructor-arg index="2" value="55"></constructor-arg>
    25     </bean>
    26     
    27     <bean id="people5" class="com.java1234.entity.People">
    28         <constructor-arg index="0" type="int" value="4"></constructor-arg>
    29         <constructor-arg index="1" type="String" value="招六"></constructor-arg>
    30         <constructor-arg index="2" type="int" value="66"></constructor-arg>
    31     </bean>
    32     
    33     <bean id="peopleFactory" class="com.java1234.factory.PeopleFactory"></bean>
    34     
    35     <bean id="people7" factory-bean="peopleFactory" factory-method="createPeople"></bean>
    36   
    37       <bean id="people8" class="com.java1234.factory.PeopleFactory2" factory-method="createPeople"></bean>
    38 </beans>

      注:

        1) 属性注入 property[name,value]

        2) 构造函数注入 constructor-arg[type|index,value]

        3) 工厂注入 非静态工厂先声明工厂bean,再通过 factory-bean、factory-method 引用

              静态工厂直接指定工厂类class,再 factory-method 

    测试类

     1 package com.java1234.test;
     2 import org.springframework.context.ApplicationContext;
     3 import org.springframework.context.support.ClassPathXmlApplicationContext;
     4 import com.java1234.entity.People;
     5 
     6 public class Test2 {
     7 
     8     public static void main(String[] args) {
     9         ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
    10         People people=(People)ac.getBean("people");
    11         System.out.println(people);
    12         
    13         // 属性注入
    14         People people2=(People)ac.getBean("people2");
    15         System.out.println(people2);
    16         
    17         // 构造方法注入
    18         People people3=(People)ac.getBean("people3");
    19         System.out.println(people3);
    20         
    21         People people4=(People)ac.getBean("people4");
    22         System.out.println(people4);
    23         
    24         People people5=(People)ac.getBean("people5");
    25         System.out.println(people5);
    26         
    27         // 工厂方法注入
    28         People people7=(People)ac.getBean("people7");
    29         System.out.println(people7);
    30         
    31         People people8=(People)ac.getBean("people8");
    32         System.out.println(people8);
    33     }
    34 }

      

     第五节 注入参数

    1、基本类型值

    2、注入 bean

    3、内部 bean

    4、null 值

    5、级联属性

    6、集合类型属性

    7、实例

    实体类People.java

     1 package com.java1234.entity;
     2 
     3 import java.util.ArrayList;
     4 import java.util.HashMap;
     5 import java.util.HashSet;
     6 import java.util.List;
     7 import java.util.Map;
     8 import java.util.Properties;
     9 import java.util.Set;
    10 
    11 public class People {
    12 
    13     private int id;
    14     private String name;
    15     private int age;
    16     private Dog dog;
    17     private List<String> hobbies=new ArrayList<String>();
    18     private Set<String> loves=new HashSet<String>();
    19     private Map<String,String> works=new HashMap<String,String>();
    20     private Properties addresses=new Properties();
    21     
    22     public People() {
    23         super();
    24         // TODO Auto-generated constructor stub
    25     }
    26     
    27     public People(int id, String name, int age) {
    28         super();
    29         this.id = id;
    30         this.name = name;
    31         this.age = age;
    32     }
    33 
    34     public Set<String> getLoves() {
    35         return loves;
    36     }
    37 
    38     public void setLoves(Set<String> loves) {
    39         this.loves = loves;
    40     }
    41 
    42     public List<String> getHobbies() {
    43         return hobbies;
    44     }
    45     public void setHobbies(List<String> hobbies) {
    46         this.hobbies = hobbies;
    47     }
    48     public Map<String, String> getWorks() {
    49         return works;
    50     }
    51     public void setWorks(Map<String, String> works) {
    52         this.works = works;
    53     }
    54 
    55     public Properties getAddresses() {
    56         return addresses;
    57     }
    58     public void setAddresses(Properties addresses) {
    59         this.addresses = addresses;
    60     }
    61 
    62     public Dog getDog() {
    63         return dog;
    64     }
    65     public void setDog(Dog dog) {
    66         this.dog = dog;
    67     }
    68 
    69     public int getId() {
    70         return id;
    71     }
    72     public void setId(int id) {
    73         this.id = id;
    74     }
    75     public String getName() {
    76         return name;
    77     }
    78     public void setName(String name) {
    79         this.name = name;
    80     }
    81     public int getAge() {
    82         return age;
    83     }
    84     public void setAge(int age) {
    85         this.age = age;
    86     }
    87 
    88     @Override
    89     public String toString() {
    90         return "People [id=" + id + ", name=" + name + ", age=" + age
    91                 + ", dog=" + dog + ", hobbies=" + hobbies + ", loves=" + loves
    92                 + ", works=" + works + ", addresses=" + addresses + "]";
    93     }
    94 
    95 
    96     
    97 }

    实体类Dog.java

     1 package com.java1234.entity;
     2 
     3 public class Dog {
     4 
     5     private String name;
     6 
     7     public String getName() {
     8         return name;
     9     }
    10 
    11     public void setName(String name) {
    12         this.name = name;
    13     }    
    14     
    15 }

    beans.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="http://www.springframework.org/schema/beans
     5         http://www.springframework.org/schema/beans/spring-beans.xsd">
     6 
     7     
     8     <bean id="people1" class="com.java1234.entity.People">
     9         <property name="id" value="1"></property>
    10         <property name="name" value="张三"></property>
    11         <property name="age" value="11"></property>
    12     </bean>
    13     
    14     <bean id="dog1" class="com.java1234.entity.Dog">
    15         <property name="name" value="Jack"></property>
    16     </bean>
    17     
    18     <bean id="people2" class="com.java1234.entity.People">
    19         <property name="id" value="1"></property>
    20         <property name="name" value="张三"></property>
    21         <property name="age" value="11"></property>
    22         <property name="dog" ref="dog1"></property>
    23     </bean>
    24     
    25     <bean id="people3" class="com.java1234.entity.People">
    26         <property name="id" value="1"></property>
    27         <property name="name" value="张三"></property>
    28         <property name="age" value="11"></property>
    29         <property name="dog">
    30             <bean class="com.java1234.entity.Dog">
    31                 <property name="name" value="Tom"></property>
    32             </bean>
    33         </property>
    34     </bean>
    35     
    36     <bean id="people4" class="com.java1234.entity.People">
    37         <property name="id" value="1"></property>
    38         <property name="name" value="张三"></property>
    39         <property name="age" value="11"></property>
    40         <property name="dog">
    41             <null></null>
    42         </property>
    43     </bean>
    44     
    45     <!-- <bean id="people5" class="com.java1234.entity.People">
    46         <property name="id" value="1"></property>
    47         <property name="name" value="张三"></property>
    48         <property name="age" value="11"></property>
    49         <property name="dog.name" value="Jack2"></property>
    50     </bean> -->
    51     
    52     <bean id="people6" class="com.java1234.entity.People">
    53         <property name="id" value="1"></property>
    54         <property name="name" value="张三"></property>
    55         <property name="age" value="11"></property>
    56         <property name="dog" ref="dog1"></property>
    57         <property name="hobbies">
    58             <list>
    59                 <value>唱歌</value>
    60                 <value>跳舞</value>
    61             </list>
    62         </property>
    63         <property name="loves">
    64             <set>
    65                 <value>唱歌2</value>
    66                 <value>跳舞2</value>
    67             </set>
    68         </property>
    69         <property name="works">
    70             <map>
    71                 <entry>
    72                     <key><value>上午</value></key>
    73                     <value>写代码</value>
    74                 </entry>
    75                 <entry>
    76                     <key><value>下午</value></key>
    77                     <value>测试代码</value>
    78                 </entry>
    79             </map>
    80         </property>
    81         <property name="addresses">
    82             <props>
    83                 <prop key="address1">aaaaa</prop>
    84                 <prop key="address2">bbbbb</prop>
    85             </props>
    86         </property>
    87     </bean>
    88     
    89 </beans>

    测试类Junit test case 

     1 package com.java1234.test;
     2 
     3 import org.junit.Before;
     4 import org.junit.Test;
     5 import org.springframework.context.ApplicationContext;
     6 import org.springframework.context.support.ClassPathXmlApplicationContext;
     7 
     8 import com.java1234.entity.People;
     9 
    10 public class T {
    11 
    12     private ApplicationContext ac;
    13 
    14     @Before
    15     public void setUp() throws Exception {
    16         ac=new ClassPathXmlApplicationContext("beans.xml");
    17     }
    18 
    19     // 基本类型值
    20     @Test
    21     public void test1() {
    22         People people=(People)ac.getBean("people1");
    23         System.out.println(people);
    24     }
    25     
    26     // 注入bean
    27     @Test
    28     public void test2() {
    29         People people=(People)ac.getBean("people2");
    30         System.out.println(people);
    31     }
    32     
    33     
    34     // 内部bean
    35     @Test
    36     public void test3() {
    37         People people=(People)ac.getBean("people3");
    38         System.out.println(people);
    39     }
    40     
    41     // 注入null
    42     @Test
    43     public void test4() {
    44         People people=(People)ac.getBean("people4");
    45         System.out.println(people);
    46     }
    47     
    48     // 级联属性
    49     @Test
    50     public void test5() {
    51         People people=(People)ac.getBean("people5");
    52         System.out.println(people);
    53     }
    54     
    55     // 注入集合
    56     @Test
    57     public void test6() {
    58         People people=(People)ac.getBean("people6");
    59         System.out.println(people);
    60     }
    61 }

    第六节 Spring 自动装配

    通过配置 default-autowire 属性,Spring IOC容器可以自动为程序注入bean;默认是no,不启动自动装配;default-autowire 的类型有 byName,byType,constructor;

    byName:通过名称进行自动匹配;

    byType:根据类型进行自动匹配;

    constructor:和byType类似,只不过它是根据构造方法注入而言的,根据类型,自动注入。

    建议:自动装配机制慎用,它屏蔽了装配细节,容易产生潜在的错误。

    第七节 方法注入

    Spring bean 作用域默认是 单例 singleton; 可以通过配置 prototype 实现多例。

    方法注入 lookup-method

    第八节 方法替换

    第九节 bean之间的关系

    1、继承(abstract="true"、parent="beanid")

    2、依赖(depends-on="beanid")

    3、引用

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="http://www.springframework.org/schema/beans
     5         http://www.springframework.org/schema/beans/spring-beans.xsd">
     6     
     7     <bean id="dog" class="com.java1234.entity.Dog">
     8         <property name="name" value="jack"></property>
     9     </bean>
    10     
    11     <bean id="abstractPeople" class="com.java1234.entity.People" abstract="true">
    12         <property name="className" value="高三5班"></property>
    13         <property name="age" value="19"></property>
    14     </bean>
    15     
    16     <bean id="zhangsan" parent="abstractPeople" depends-on="autority">
    17         <property name="id" value="1"></property>
    18         <property name="name" value="张三"></property>
    19     </bean>
    20     
    21     <bean id="lisi" parent="abstractPeople">
    22         <property name="id" value="2"></property>
    23         <property name="name" value="李四"></property>
    24         <property name="age" value="20"></property>
    25         <property name="dog" ref="dog"></property>
    26     </bean>
    27     
    28     
    29     <bean id="autority" class="com.java1234.service.Authority"></bean>
    30 </beans>

     第十节 bean 作用范围

    1、singleton Spring IOC 容器中仅有一个 bean 实例,bean 已单例的方式存在;

    2、prototype 每次从容器中调用 bean 时, 都返回一个新的实例;

    3、request 每次http 请求都会创建一个新的bean;

    4、session 同一个 http session 共享一个 bean;

    5、global session 同一个全局 session 共享一个 bean, 一般用于portlet应用环境;

    6、application 同一个 application 共享一个 bean;

  • 相关阅读:
    OpenCV图片类cv::Mat和QImage之间进行转换(好多相关文章)
    在 .pro里加入 QMAKE_CXXFLAGS += /MP 将并行编译(VC),加快编译速度(姚冬的办法),或者-j4参数(MinGW)
    GUI为什么不设计为多线程(用户事件和底层事件的流程是相反的,每层都加锁效率太低,共用一把锁那就是单线程)
    QML的渲染方式相较于之前的版本也有了重大的更新(CPU线程负责绘制,GPU线程负责渲染),还有好多经常评论 good
    分析Sizzle引擎
    当Azure里的虚拟机网卡被禁用
    SQL Server跨网段(跨机房)FTP复制
    公众平台Bee.WeiXin
    使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享
    阿里巴巴笔试
  • 原文地址:https://www.cnblogs.com/herongxian/p/6389111.html
Copyright © 2011-2022 走看看