乐虎游戏|乐虎国际登录|欢迎你

Spring中的Bean配置方式

日期:2019-11-02编辑作者:计算机资讯

Spring基础——在Spring Config 文件中配置 Bean,springbean

一、基于 XML 的 Bean 的配置

1.通过属性注入

即通过 setXxx() 方法注入 Bean 的属性值或依赖的对象。

使用 <property name="" value="" ref=""/> 元素,其中 name 值为对应 Bean 属性名称,value 指定对应属性值,ref 引用其他 Bean,value 属性和 ref 属性不可以同时存在。

也可以通过 <value></value> 子节点的方式指定属性值。

e:

<bean id="helloWorld" class="com.nucsoft.spring.helloworld.HelloWorld">
  <property name="hello" value="spring"/>
  <property name="world">
    <value>spring</value>
  </property>
</bean>

注意:在此种方式下,要配置的 Bean 必须存在空参构造器。

2.通过构造器注入

通过构造方法注入属性值或依赖的对象。

使用 <constructor-arg value="" index="" name="" ref="" type=""/> 元素,value 属性为对应的参数指定值,ref 引用其他 Bean。不可同时存在。

通过 name 属性、index 属性、type属性提供了三种注入方式:

(1)name:按照构造器参数名匹配入参

<bean id="car1" class="com.nucsoft.spring.helloworld.Car">
  <constructor-arg name="brand" value="奥迪"/>
  <constructor-arg name="corp" value="上海"/>
  <constructor-arg name="price" value="400000"/>
</bean>

(2)index:按照索引匹配入参

<bean id="car2" class="com.nucsoft.spring.helloworld.Car">
  <constructor-arg index="0" value="大众"/>
  <constructor-arg index="1" value="10000"/>
</bean>

(3)type:按照类型匹配入参

<bean id="car3" class="com.nucsoft.spring.helloworld.Car">
  <constructor-arg type="java.lang.String" value="宝马"/>
  <constructor-arg type="double" value="200000"/>
</bean>

注意:Spring 虽然提供了通过构造器的方式进行注入,但是并不推荐使用此种方式。

3.细节问题

(1)若注入的属性值包含特殊字符,可以使用 <![CDATA[]]> 包含该属性值。

如:

<bean id="car4" class="com.nucsoft.spring.Car">
  <property name="brand">
    <value><![CDATA[<BM>]]> </value>
  </property>
  <property name="corp" value="德国"/>
  <property name="maxSpeed" value="230"/>
  <property name="price" value="20000000"/>
</bean>

(2)可以通过 <ref> 元素或 ref 属性为 Bean 的属性或构造器指定对 Bean 的引用。

 如:

e1:

<bean id="service" class="com.nucsoft.spring.Service"/>
<bean id="action" class="com.nucsoft.spring.Action">
    <property name="service" ref="service"/>
</bean>

e2:

<bean id="feather" class="com.nucsoft.spring.Feather">
  <property name="length" value="13"/>
</bean>

<bean id="bird" class="com.nucsoft.spring.Bird">
  <constructor-arg name="birdName" value="smallBird"/>
  <constructor-arg name="feather" ref="feather"/>
</bean>

(3)内部Bean:可以在属性或构造器里包含 Bean 的声明,内部 Bean 不需要指定 id,同时在别的地方也无法引用。

 如:

e1:

<bean id="action" class="com.nucsoft.spring.Action">
  <property name="service">
  <bean class="com.nucsoft.spring.Service"/>
  </property>
</bean>

e2:

<bean id="bird" class="com.nucsoft.spring.Bird">
  <constructor-arg name="birdName" value="smallBird"/>
  <constructor-arg name="feather">
    <bean class="com.nucsoft.spring.Feather">
      <property name="length" value="13"/>
    </bean>
  </constructor-arg>
</bean>

4.为引用类型(字符串或对象)注入 Null 值

<bean id="bird" class="com.nucsoft.spring.Bird">
  <constructor-arg name="birdName" value="smallBird"/>
  <constructor-arg name="feather">
    <null/>
   </constructor-arg>
</bean>

5.为级联属性注入

(1)通过属性

<bean id="feather" class="com.nucsoft.spring.Feather">
  <property name="length" value="44"/>
</bean>

<bean id="bird" class="com.nucsoft.spring.Bird">
  <property name="birdName" value="smallBird"/>
  <property name="feather" ref="feather"/>
  <property name="feather.length" value="23"/>
</bean>

(2)通过构造器

<bean id="feather" class="com.nucsoft.spring.Feather">
    <property name="length" value="44"/>
</bean>
<bean id="bird2" class="com.nucsoft.spring.Bird">
    <constructor-arg name="birdName" value="bigBird"/>
    <constructor-arg name="feather" ref="feather"/>
    <property name="feather.length" value="33"/>
</bean>

注意:设置级联属性的前提是,级联属性所属对象已经被注入到容器中。同时需要为级联属性所属对象提供 getXxx() 方法。

6.集合属性

(1)集合性质的类型:List,Set,Map 和 数组

(2)使用 <list>,<set>,<map> 来配置集合属性,其中数组和 List 都使用 <list>

(3)List:通过引用外部 Bean 或 创建内部 Bean 的方式

<bean id="department" class="com.nucsoft.spring.Department">
  <property name="deptName" value="dept01"/>
</bean>

<bean id="company" class="com.nucsoft.spring.Company">
  <property name="companyName" value="ICBC"/>
  <property name="departments">
    <list>
      <ref bean="department"/>
      <bean class="com.nucsoft.spring.Department">
        <property name="deptName" value="dept02"/>
      </bean>
    </list>
  </property>
</bean>

测试:

private ApplicationContext ctx = null;

@Before
public void init() {
  ctx = new ClassPathXmlApplicationContext("spring/ApplicationContext.xml");
}

@Test
public void test01() {
  Company com = ctx.getBean(Company.class);
  System.out.println(com);
}

输出:

Company{companyName='ICBC', departments=[Department{deptName='dept01'}, Department{deptName='dept02'}]}

(4)Set:与 List 类似。不做重复说明。

(5)Map: 在<map> 标签中使用多个 <entry> 子标签:简单字面值使用属性 key 和 value 来定义,Bean 的引用通过 key-ref 和 value-ref 属性定义。

如:

<bean id="emp02" class="com.nucsoft.spring.Employee">
  <property name="employeeName" value="emp02"/>
  <property name="age" value="23"/>
</bean>

<bean id="department" class="com.nucsoft.spring.Department">
  <property name="deptName" value="dept01"/>
</bean>
<bean id="department02" class="com.nucsoft.spring.Department">
  <property name="deptName" value="dept02"/>
</bean>

<bean id="company" class="com.nucsoft.spring.Company">
  <property name="companyName" value="ICBC"/>
  <property name="departments">
    <map>
      <entry key-ref="department" value-ref="emp01"/>
      <entry key-ref="department02" value-ref="emp02"/>
    </map>
  </property>
  <property name="strs">
    <map>
      <entry key="key01" value="value01"/>
      <entry key="key02" value="value02"/>
    </map>
  </property>
</bean>

测试:

private ApplicationContext ctx = null;

@Before
public void init() {
  ctx = new ClassPathXmlApplicationContext("spring/ApplicationContext.xml");
}

@Test
public void test01() {
  Company com = ctx.getBean(Company.class);
  System.out.println(com);
}

输出:

Company{companyName='ICBC', departments={Department{deptName='dept01'}=Employee{employeeName='emp01', age=12}, Department{deptName='dept02'}=Employee{employeeName='emp02', age=23}}}

注意:不能在 <entry> 标签中定义 Bean 标签,不支持。

(6)Properties 类型的属性:和 Map 类似,在 <props> 标签中使用 <prop> 子标签, 每个 <prop> 子标签必须定义 key 属性。

<bean id="DataSourceId" class="com.nucsoft.spring.DataSourceBean">
  <property name="propertiesInfo">
    <props>
      <prop key="user">root</prop>
      <prop key="password"></prop>
      <prop key="jdbcUrl">jdbc:mysql:///test</prop>
      <prop key="driverClass">com.mysql.jdbc.Driver</prop>
    </props>
  </property>
</bean>

7.定义单独的集合 Bean

使用基本的集合标签定义集合时,不能将集合作为独立的 Bean 定义,导致其他 Bean 无法引用该集合,所以无法在不同的 Bean 之间共用。

可以使用 util schema 里的集合标签定义独立的集合 Bean。需要注意的是,定义的集合 Bean 与 <bean> 标签是同级别的。

<bean id="company" class="com.nucsoft.spring.Company">
  <property name="companyName" value="ICBC"/>
  <property name="departments" ref="departments"/>
</bean>

<util:list id="departments">
  <bean class="com.nucsoft.spring.Department">
    <property name="deptName" value="dept01"/>
  </bean>
  <ref bean="department02"/>
</util:list>

可以定义到外部的集合 Bean 有:

图片 1

8.使用 p 命名空间,简化 XML 配置文件

<bean id="emp" class="com.nucsoft.spring.Employee" p:employeeName="emp" p:age="23" />

二、基于注解的 Bean 的配置

 

 

 

 

未完,待续。

Config 文件中配置 Bean,springbean 一、基于 XML 的 Bean 的配置 1.通过属性注入 即通过 setXxx() 方法注入 Bean 的属性值或依赖...

一、基于 XML 的 Bean 的配置——通过全类名(反射)

1.IOC和DI概述

<bean

IOC(Inversion of Control):其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式。
DI(Dependency Injection) — IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入. 相对于 IOC 而言,这种表述更直接。

<!-- id: bean 的名称在IOC容器内必须是唯一的若没有指定,则自动的将全限定类名作为 改 bean 的名称-->id="hello"

2.Bean的配置方式

<!-- 通过全类名的方式来配置 bean -->class="com.atguigu.spring.helloworld.HelloWorld">

Bean 的配置方式:通过全类名、通过工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean。

</bean>

2.1 Spring通过全类名配置Bean特点:

1.通过属性注入

  1. 基于xml文件的方式,
  2. 通过全类名反射,
  3. 依靠IOC容器,
  4. 依赖注入的方式:属性注入,构造器注入

即通过 setXxx() 方法注入 Bean 的属性值或依赖的对象。

基于xml文件的方式配置Bean

使用 <property name="" value="" ref=""/> 元素,其中 name 值为对应 Bean 属性名称,value 指定对应属性值,ref 引用其他 Bean,value 属性和 ref 属性不可以同时存在。

<bean  >  <property name="name" value="koala"></property></bean>

也可以通过 <value></value> 子节点的方式指定属性值。

id:Bean的名称,在IOC容器中必须是惟一的。

e:

2.2通过工厂方法配置Bean

<bean id="helloWorld" class="com.nucsoft.spring.helloworld.HelloWorld">
  <property name="hello" value="spring"/>
  <property name="world">
    <value>spring</value>
  </property>
</bean>

2.2.1 通过调用静态工厂配置Bean

注意:在此种方式下,要配置的 Bean 必须存在空参构造器。

调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中. 当客户端需要对象时, 只需要简单地调用静态方法, 而不用关心创建对象的细节.

2.通过构造器注入

要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 factory-method 属性里指定工厂方法的名称. 最后, 使用 <constrctor-arg> 元素为该方法传递方法参数.

通过构造方法注入属性值或依赖的对象。

示例代码:

使用 <constructor-arg value="" index="" name="" ref="" type=""/> 元素,value 属性为对应的参数指定值,ref 引用其他 Bean。不可同时存在。

Car.java

通过 name 属性、index 属性、type属性提供了三种注入方式:

package com.java.spring.factory;public class Car {private String brand;private double price;public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public Car(String brand, double price) {super();this.brand = brand;this.price = price;}@Overridepublic String toString() {return "Car [brand=" + brand + ", price=" + price + "]";}}

(1)name:按照构造器参数名匹配入参

StaticCarFactory.java

<bean id="car1" class="com.nucsoft.spring.helloworld.Car">
  <constructor-arg name="brand" value="奥迪"/>
  <constructor-arg name="corp" value="上海"/>
  <constructor-arg name="price" value="400000"/>
</bean>
package com.java.spring.factory;
import java.util.HashMap;
import java.util.Map;
public class StaticCarFactory {
 private static Map<String,Car> cars=new HashMap<String,Car>();
 static{
  cars.put("audi",new Car("audi",300000.00));
  cars.put("ford",new Car("ford",400000.00));
 }
   //静态工厂方法
 public static Car getCar(String name){
  return cars.get;
 } 
}

(2)index:按照索引匹配入参

在beans-factory.xml中进行配置:

<bean id="car2" class="com.nucsoft.spring.helloworld.Car">
  <constructor-arg index="0" value="大众"/>
  <constructor-arg index="1" value="10000"/>
</bean>
<bean   factory-method="getCar">  <constructor-arg value="audi"></constructor-arg></bean>

(3)type:按照类型匹配入参

主方法中进行实例化Bean:

<bean id="car3" class="com.nucsoft.spring.helloworld.Car">
  <constructor-arg type="java.lang.String" value="宝马"/>
  <constructor-arg type="double" value="200000"/>
</bean>
package com.java.spring.factory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args){ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-factory.xml");Car car1= ctx.getBean;System.out.println;}}

注意:Spring 虽然提供了通过构造器的方式进行注入,但是并不推荐使用此种方式。

运行后输出:

3.细节问题

Car [brand=audi, price=300000.0]

(1)若注入的属性值包含特殊字符,可以使用 <![CDATA[]]> 包含该属性值。

静态工厂方法就是直接调用一个类的静态方法就能返回Bean的实例,上面代码中根据静态工厂方法public static Car getCar(String name)来配置Bean实例。

如:

2.2.2 通过调用实例工厂方法创建 Bean

<bean id="car4" class="com.nucsoft.spring.Car">
  <property name="brand">
    <value><![CDATA[<BM>]]> </value>
  </property>
  <property name="corp" value="德国"/>
  <property name="maxSpeed" value="230"/>
  <property name="price" value="20000000"/>
</bean>

实例工厂方法: 将对象的创建过程封装到另外一个对象实例的方法里. 当客户端需要请求对象时, 只需要简单的调用该实例方法而不需要关心对象的创建细节.

(2)可以通过 <ref> 元素或 ref 属性为 Bean 的属性或构造器指定对 Bean 的引用。

要声明通过实例工厂方法创建的 Bean:

 如:

  • 在 bean 的 factory-bean 属性里指定拥有该工厂方法的 Bean;
  • 在 factory-method 属性里指定该工厂方法的名称;
  • 使用 construtor-arg 元素为工厂方法传递方法参数;

e1:

InstanceCarFactory.java

<bean id="service" class="com.nucsoft.spring.Service"/>
<bean id="action" class="com.nucsoft.spring.Action">
    <property name="service" ref="service"/>
</bean>
package com.java.spring.factory;import java.util.HashMap;import java.util.Map;public class InstanceCarFactory {private static Map<String,Car> cars=null;public InstanceCarFactory() {cars=new HashMap<String,Car>();cars.put("Audi",new Car("Audi",300000.00));cars.put("Ford",new Car("Ford",400000.00));}public Car getCar(String brand){return cars.get;}}

e2:

在beans-factory.xml中进行配置:

<bean id="feather" class="com.nucsoft.spring.Feather">
  <property name="length" value="13"/>
</bean>

<bean id="bird" class="com.nucsoft.spring.Bird">
  <constructor-arg name="birdName" value="smallBird"/>
  <constructor-arg name="feather" ref="feather"/>
</bean>
//配置工厂的实例
<bean  ></bean>
//通过实例工厂方法来配置bean<bean  factory-bean="carFactory" factory-method="getCar">  <constructor-arg value="Ford"></constructor-arg></bean>

(3)内部Bean:可以在属性或构造器里包含 Bean 的声明,内部 Bean 不需要指定 id,同时在别的地方也无法引用。

2.3 实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean

 如:

Spring 中有两种类型的 Bean, 一种是普通Bean, 另一种是工厂Bean, 即FactoryBean. 工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的 getObject 方法所返回的对象。

e1:

package com.java.spring.FactoryBean;import org.springframework.beans.factory.FactoryBean;public class CarFactoryBean implements FactoryBean{private String brand;public void setBrand(String brand){this.brand=brand;}@Override
        //FactoryBean返回的实例public Car getObject() throws Exception {return new Car(brand,500000.00);}@Override
        //FactoryBean返回的实例是否为单例public boolean isSingleton() {return false;}@Override
        //FactoryBean返回的类型public Class getObjectType() {return Car.class;}}
<bean id="action" class="com.nucsoft.spring.Action">
  <property name="service">
  <bean class="com.nucsoft.spring.Service"/>
  </property>
</bean>

在beans-factory.xml中进行配置:

e2:

<bean  >  <property name="brand" value="BWM"></property></bean>
<bean id="bird" class="com.nucsoft.spring.Bird">
  <constructor-arg name="birdName" value="smallBird"/>
  <constructor-arg name="feather">
    <bean class="com.nucsoft.spring.Feather">
      <property name="length" value="13"/>
    </bean>
  </constructor-arg>
</bean>

在主方法中实例化:

4.为引用类型(字符串或对象)注入 Null 值

Object car3= ctx.getBean;
<bean id="bird" class="com.nucsoft.spring.Bird">
  <constructor-arg name="birdName" value="smallBird"/>
  <constructor-arg name="feather">
    <null/>
   </constructor-arg>
</bean>

3.获取Bean

5.为级联属性注入

Spring提供的最常用的IOC容器实现是ApplicationContext,ApplicationContext的主要实现类ClassPathXmlApplicationContext从类路径下加载配置文件。

(1)通过属性

创建Spring的IOC对象:

<bean id="feather" class="com.nucsoft.spring.Feather">
  <property name="length" value="44"/>
</bean>

<bean id="bird" class="com.nucsoft.spring.Bird">
  <property name="birdName" value="smallBird"/>
  <property name="feather" ref="feather"/>
  <property name="feather.length" value="23"/>
</bean>
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");

(2)通过构造器

从IOC容器中获取Bean:调用ApplicationContext的getBean()方法。

<bean id="feather" class="com.nucsoft.spring.Feather">
    <property name="length" value="44"/>
</bean>
<bean id="bird2" class="com.nucsoft.spring.Bird">
    <constructor-arg name="birdName" value="bigBird"/>
    <constructor-arg name="feather" ref="feather"/>
    <property name="feather.length" value="33"/>
</bean>
HelloWorld helloWorld=(HelloWorld) ctx.getBean("helloworld");

注意:设置级联属性的前提是,级联属性所属对象已经被注入到容器中。同时需要为级联属性所属对象提供 getXxx() 方法。

4.Spring依赖注入的方式

6.集合属性

4.1 属性注入

(1)集合性质的类型:List,Set,Map 和 数组

属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象。使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值,是最常用的注入方式。

(2)使用 <list>,<set>,<map> 来配置集合属性,其中数组和 List 都使用 <list>

例如:

(3)List:通过引用外部 Bean 或 创建内部 Bean 的方式

<bean  >  <property name="name" value="koala"></property></bean>
<bean id="department" class="com.nucsoft.spring.Department">
  <property name="deptName" value="dept01"/>
</bean>

<bean id="company" class="com.nucsoft.spring.Company">
  <property name="companyName" value="ICBC"/>
  <property name="departments">
    <list>
      <ref bean="department"/>
      <bean class="com.nucsoft.spring.Department">
        <property name="deptName" value="dept02"/>
      </bean>
    </list>
  </property>
</bean>

4.2 构造方法注入

测试:

通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。构造器注入在 <constructor-arg> 元素里声明属性, <constructor-arg> 中没有 name 属性。

private ApplicationContext ctx = null;

@Before
public void init() {
  ctx = new ClassPathXmlApplicationContext("spring/ApplicationContext.xml");
}

@Test
public void test01() {
  Company com = ctx.getBean(Company.class);
  System.out.println(com);
}

Car.java

输出:

package com.java.spring;public class Car {private String brand;private String corp;private double price;private int maxSpeed;public Car(String brand, String corp, double price) {super();this.brand = brand;this.corp = corp;this.price = price;}public Car(String brand, String corp, int maxSpeed) {super();this.brand = brand;this.corp = corp;this.maxSpeed = maxSpeed;}@Overridepublic String toString() {return "Car [brand=" + brand + ", corp=" + corp + ", price=" + price + ", maxSpeed=" + maxSpeed + "]";}}

Company{companyName='ICBC', departments=[Department{deptName='dept01'}, Department{deptName='dept02'}]}

4.2.1 按索引匹配入参

(4)Set:与 List 类似。不做重复说明。

在XML中设置:

(5)Map: 在<map> 标签中使用多个 <entry> 子标签:简单字面值使用属性 key 和 value 来定义,Bean 的引用通过 key-ref 和 value-ref 属性定义。

<bean  >  <constructor-arg value="Audi" index="0"></constructor-arg>  <constructor-arg value="上海" index="1"></constructor-arg>  <constructor-arg value="500000.0000" index="2"></constructor-arg></bean>

本文由乐虎游戏发布于计算机资讯,转载请注明出处:Spring中的Bean配置方式

关键词:

java虚拟机总结,java虚拟机

Jvm 内存浅析 及 GC个人学习总计,jvmgc 从出生到现在,20多年过去,Java到现在仍为选取最为不感到奇的言语。那仰赖于...

详细>>

GA电子游戏:非GUI格局下Window下推行jmeter质量测验(登陆)

引言:互连网服务压测是这几个关键的评论和介绍格局,ab,webbench,jmeter等都是产业界流行的测量检验工具,ab和w...

详细>>

Java高级软件工程师面试考纲,java考纲

【java技术栈】总序,java 技术栈(technologystack)常被用来指代某项工作或某个职位需要掌握的一系列技能的总和。一...

详细>>

基于Linux下网络聊天室的设计与实现 PDF

本系统采用C/S结合的结构,客户端与客户端以及客户端与服务器端之间通过基于TCP/IP协议Socket套接口传送消息。服务...

详细>>