• 依赖注入Bean属性


    一、Bean属性依赖注入
    对于类成员变量,注入方式有三种
      •构造函数注入
      •属性setter方法注入
      •接口注入
    Spring支持前两种
    1、构造函数 属性注入
    使用构造方法注入,在Spring配置文件中,通过<contruct-arg>设置注入的属性(可以通过index或者type注入)
     
     
    2、setter方法注入
     
    使用setter方法注入,在Spring配置文件中,通过<property>设置注入的属性
     
     
    注入一个复杂类型,通过<property> ref属性 引用其他Bean
     1 package cn.itcast.spring.di;
     2 //构造方法注入
     3 public class Car {
     4     private String name;
     5     private String color;
     6 
     7     public Car(String name, String color) {
     8         super();
     9         this.name = name;
    10         this.color = color;
    11     }
    12 
    13     @Override
    14     public String toString() {
    15         return "Car [name=" + name + ", color=" + color + "]";
    16     }
    17 }
    18 
    19 package cn.itcast.spring.di;
    20 //setter方法注入
    21 public class Car2 {
    22     private String name;
    23     private String color;
    24 
    25     public void setName(String name) {
    26         this.name = name;
    27     }
    28 
    29     public void setColor(String color) {
    30         this.color = color;
    31     }
    32 
    33     @Override
    34     public String toString() {
    35         return "Car2 [name=" + name + ", color=" + color + "]";
    36     }
    37 
    38 }
    39 
    40 package cn.itcast.spring.di;
    41 
    42 //employee 引用一个复杂数据类型 Car2
    43 public class Employee {
    44     private String name;
    45     private Car2 car2;
    46 
    47     public void setCar2(Car2 car2) {
    48         this.car2 = car2;
    49     }
    50 
    51     public void setName(String name) {
    52         this.name = name;
    53     }
    54 
    55     @Override
    56     public String toString() {
    57         return "Employee [name=" + name + ", car2=" + car2 + "]";
    58     }
    59 
    60 }
    61 
    62     <!-- 使用构造函数 完成属性注入 -->
    63     <bean id="car" class="cn.itcast.spring.di.Car">
    64         <!-- 构造函数注入 通过constructor-arg  -->
    65         <!-- 通过索引和类型,指定注入参数位置 -->
    66         <constructor-arg index="0" type="java.lang.String" value="宝马"></constructor-arg>
    67         <constructor-arg index="1" type="java.lang.String" value="红色"></constructor-arg>
    68     </bean>
    69     
    70     <!-- 使用setter 方法注入 -->
    71     <bean id="car2" class="cn.itcast.spring.di.Car2">
    72         <!-- setter 方法注入 ,根据setter 方法编写注入属性  -->
    73         <property name="name" value="保时捷"></property>
    74         <property name="color" value="黑色"></property>
    75     </bean>
    76 
    77         <!--注入一个复杂类型,通过<property> ref属性 引用其他Bean -->
    78     <bean id="employee" class="cn.itcast.spring.di.Employee">
    79         <property name="name" value="小丽"></property>
    80         <!-- ref 引用另一个Bean -->
    81         <property name="car2" ref="car2"></property>
    82     </bean>
     1 // 测试复杂类型 注入
     2     @Test
     3     public void demo3() {
     4         ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
     5                 "applicationContext.xml");
     6         Employee employee = (Employee) applicationContext.getBean("employee");
     7         System.out.println(employee);
     8     }
     9 
    10     // 测试setter 方法注入
    11     @Test
    12     public void demo2() {
    13         ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
    14                 "applicationContext.xml");
    15         Car2 car2 = (Car2) applicationContext.getBean("car2");
    16         System.out.println(car2);
    17     }
    18 
    19     // 测试构造函数属性注入
    20     @Test
    21     public void demo1() {
    22         ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
    23                 "applicationContext.xml");
    24         Car car = (Car) applicationContext.getBean("car");
    25         System.out.println(car);
    26     }

    3、p名称空间的使用

    从spring2.5版本,为了简化 bean属性注入写法,引入p名称空间

    p:<属性名>="xxx"  引入常量值

    p:<属性名>-ref="xxx"  引入其他bean对象

    使用p名称空间之前,先引用p名称空间:"xmlns:p="http://www.springframework.org/schema/p" 加入bean 元素  

    1 <bean id="employee" class="cn.itcast.spring.di.Employee">
    2         <property name="name" value="小丽"></property>
    3         <property name="car2" ref="car2"></property>
    4 </bean>

    简化为:  

    1 <!-- 使用p名称空间 -->
    2 <bean id="employee" class="cn.itcast.spring.di.Employee" p:name="小丽" p:car2="#{car2}" />

    4、SpEL (Spring Expression Language ) 的使用

    Spring 3.0 创建了一种新的方式用以配置对象的注入(set 注入或者构造参数注入),它便是SpEL (Spring Expression Language)

    语法格式 : #{...}

    用法一: 向一个Bean 引用另一个Bean

    1 <property name="car2" ref="car2" />  ------ >  <property name="car2" value="#{car2}" /

    用法二: 使用另一个Bean属性 为当前Bean 属性赋值

     1 public class CarInfo {
     2     // 说明CarInfo 有个 name 属性
     3     public String getName() {
     4         return "奇瑞QQ";
     5     }
     6 
     7     // 是一个普通方法
     8     public String initColor() {
     9         return "白色";
    10     }
    11 
    12 }
    View Code 
    1     <bean id="carinfo" class="cn.itcast.spring.di.CarInfo"></bean>
    2     <bean id="car3" class="cn.itcast.spring.di.Car2">
    3         <property name="name" value="#{carinfo.name}"></property>
    4     </bean>

            car3 的name值,调用 carinfo对象 getName() 方法
           

    用法三 : 使用另一个Bean 方法 ,为当前Bean 属性赋值    

     1 public class CarInfo {
     2     // 说明CarInfo 有个 name 属性
     3     public String getName() {
     4         return "奇瑞QQ";
     5     }
     6 
     7     // 是一个普通方法
     8     public String initColor() {
     9         return "白色";
    10     }
    11 
    12 }
    View Code
    1      <bean id="carinfo" class="cn.itcast.spring.di.CarInfo"></bean>
    2      <bean id="car3" class="cn.itcast.spring.di.Car2">
    3          <property name="name" value="#{carinfo.name}"></property>
    4          <property name="color" value="#{carinfo.initColor()}"></property>
    5      </bean>
    6         

            car3 的color值,有carinfo对象 initColor方法提供的
       

    用法四: 读取properties 文件的值

    5、如何向一个Bean对象 ,注入集合类型的属性

        List 、Set 、 Map 、Properties
     1 // 集合Bean ,向Bean中注入 List 、 Set 、Map 、Properties 对应数据
     2 
     3 public class CollectionBean {
     4     private List<String> hobbies;
     5     private Set<Car2> cars;
     6     private Map<String, Integer> webSiteVisitMap;
     7     private Properties employees;
     8 
     9     public void setHobbies(List<String> hobbies) {
    10         this.hobbies = hobbies;
    11     }
    12 
    13     public void setCars(Set<Car2> cars) {
    14         this.cars = cars;
    15     }
    16 
    17     public void setWebSiteVisitMap(Map<String, Integer> webSiteVisitMap) {
    18         this.webSiteVisitMap = webSiteVisitMap;
    19     }
    20 
    21     public void setEmployees(Properties employees) {
    22         this.employees = employees;
    23     }
    24 
    25     @Override
    26     public String toString() {
    27         return "CollectionBean [hobbies=" + hobbies + ", cars=" + cars
    28                 + ", webSiteVisitMap=" + webSiteVisitMap + ", employees="
    29                 + employees + "]";
    30     }
    31 
    32 }
    33 
    34 <!-- 向Bean注入 集合类型属性 -->
    35     <bean id="collectionBean" class="cn.itcast.spring.di.CollectionBean">
    36         <!-- 注入list 基本数据类型 -->
    37         <property name="hobbies">
    38             <list>
    39                 <value>体育</value>
    40                 <value>音乐</value>
    41                 <value>爬山</value>
    42             </list>
    43         </property>
    44         <!-- 注入 Set 复杂数据类型 -->
    45         <property name="cars">
    46             <set>
    47                 <ref bean="car2"/>
    48                 <ref bean="car3"/>
    49             </set>
    50         </property>
    51         <!-- 注入Map -->
    52         <property name="webSiteVisitMap">
    53             <map>
    54                 <entry key="传智播客" value="100"></entry>
    55                 <entry key="黑马程序员" value="110"></entry>
    56             </map>
    57         </property>        
    58         <!-- 注入property -->
    59         <property name="employees">
    60             <props>
    61                 <prop key="张三">传智播客</prop>
    62                 <prop key="李四">黑马程序员</prop>
    63             </props>
    64         </property>
    65     </bean>
    66     
    67 </beans>
    68 
    69     // 测试集合属性赋值
    70     @Test
    71     public void demo5() {
    72         ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
    73                 "applicationContext.xml");
    74         CollectionBean collectionBean = (CollectionBean) applicationContext
    75                 .getBean("collectionBean");
    76         System.out.println(collectionBean);
    77     }
  • 相关阅读:
    js兼容性——获取当前浏览器窗口的宽高
    pip 换源
    5 二分查找 算法
    顺序查找 冒泡 快排 等
    4 顺序表和链表
    python垃圾回收机制
    3 栈 队列 双头队列
    2 数据结构的性能分析 timeit
    1 时间复杂度
    线程池 爬取一本小说
  • 原文地址:https://www.cnblogs.com/kingxiaozi/p/3388047.html
Copyright © 2020-2023  润新知