注:本文主要介绍了spring基于XML的Bean,以及一些属性的注入方式。
具体装配方式有:属性注入、构造器注入
null值的配置、list配置、map配置、properties配置、单利集合装配bean、p命名空间为bean的属性赋值.
Spring核心
Spring的IOC容器装配Bean
IOC 容器 BeanFactory & ApplicationContext 概述
依赖注入的方式:属性注入;构造器注入ApplicationContext 的主要实现类:
ClassPathXmlApplicationContext(常用):从类路径下加载配置文件
FileSystemXmlApplicationContext:从文件系统中加载配置文件
ConfigurableApplicationContext扩展于 ApplicationContext,新增加两个主要方法:refresh() 和 close(),让 ApplicationContext 具有启动、刷新和关闭上下文的能力
ApplicationContext 在初始化上下文时就实例化所有单例的 Bean。
WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作。
开发前需要引入的jar:
<properties>
<spring.version>4.0.4.RELEASE</spring.version>
<mysql.version>5.1.34</mysql.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<!-- spring framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<!-- AspectJ注解 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.hibernate.common</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>4.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.21.0-GA</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.21.0-GA</version>
</dependency>
属性注入
在 IOC 容器中必须是唯一的
若 id 没有指定,Spring 自动将权限定性类名作为 Bean的名字
id 可以指定多个名字,名字之间可用逗号、分号、或空格分隔public class HelloWorld {
private String name;
//提供get/set方法
xml的配置:
<!-- 配置bean, class:bena的全类名,通过反射的方式在IOC容器中创建bena,所以需求bena必须是无参构造 id:bean的唯一标示, -->
<bean id="helloWorld" class="org.spring.test.HelloWorld">
<property name="name" value="test1"/>
</bean>
构造器注入
public class Car {
private String brand;
private String corp;
private double price;
private int maxSpeed;
//不提供get/set方法
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;
}
xml配置:
<bean id="car" class="org.mybatis.xwb.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg value="shanghai" index="1"></constructor-arg>
<constructor-arg value="3000" type="double"></constructor-arg>
</bean>
<!--给第二个构造方法进行bean配置。使用构造器注入属性值可以指定参数的位值和参数的类型,以区分构造器的-->
<bean id="car2" class="org.mybatis.xwb.Car">
<constructor-arg value="baoma" type="java.lang.String"></constructor-arg>
<constructor-arg type="java.lang.String">
<!--如果值有特殊标记的,则使用<![CDATA[]]>-->
<value><![CDATA[<shanghai>]]></value>
</constructor-arg>
<!—此处可以使用value子节点进行注入 -->
<constructor-arg type="int">
<value>240</value>
</constructor-arg>
</bean>
构造器引入其他方法(注入的其他方法):
<bean id="person" class="org.spring.test.Person">
<property name="name" value="zhangsa"></property>
<property name="age" value="23"></property>
<!--可以使用property建立bean之间的引用关系 -->
<!--
<property name="car" ref="car2"></property>
-->
<!--可以使用以下的bean去注入car,和上面的效果一样 -->
<!--
<property name="car">
<ref bean="car2" />
</property>
-->
<!--使用内部bean,不能被外部bean引用,只能在内部使用 -->
<property name="car">
<bean class="org.spring.test.Car">
<constructor-arg value="Ford"></constructor-arg>
<constructor-arg value="Changan"></constructor-arg>
<constructor-arg value="200000"type="double"></constructor-arg>
</bean>
</property>
</bean>
属性注入Null
public class Person{
private String name;
private int age;
private Car car;
xml配置:
<bean id="person1" class="org.mybatis.xwb.Person">
<constructor-arg value="zhangsa"></constructor-arg>
<constructor-arg value="23"></constructor-arg>
<constructor-arg><null/></constructor-arg>
</bean>
list属性配置
public class Person{
private String name;
private int age;
private List<Car> cars;
提供get/set方法
xml配置:
<bean id="person3" class="org.mybatis.xwb.po.Person">
<property name="name" value="zhangsan1"></property>
<property name="age" value="345"></property>
<property name="cars">
<list>
<ref bean="car"/>
<ref bean="car2"/>
</list>
</property>
</bean>
map值的注入:
public class NewPerson {
private String name;
private intage;
private Map<String, Object> cars;
xml配置:
<!-- 配置Map属性值 -->
<bean id="newPerson" class="org.mybatis.xwb.po.NewPerson">
<property name="name" value="Rose"></property>
<property name="age" value="28"></property>
<property name="cars">
<!-- 使用map节点及map的entry子节点配置Map类型的成员变量 -->
<map>
<entry key="AA" value-ref="car"></entry>
<entry key="ABB" value-ref="car2"></entry>
</map>
</property>
</bean>
properties的配置
public class DataSource {
private java.util.Properties properties;
xml配置:
<!-- 配置Properties属性值 -->
<beanid="dataSource" class="org.mybatis.xwb.po.DataSource">
<property name="properties">
<!-- 使用props和prop子节点来为Properties属性赋值 -->
<props>
<prop key="user">root</prop>
<prop key="password">1234</prop>
<prop key="jdbc:url">jdbc:mysql//test</prop>
<prop key="jdbc:driverClass">com.mysql.hjdbc.Driver</prop>
</props>
</property>
</bean>
单利集合Bean配置
public class Person{
private String name;
private int age;
private List<Car> cars;
xml配置:
<!-- 配置单例的集合bean,以供多个bean进行引用 -->
<util:list id="cars">
<!-- 需要导入util命名空间 -->
<ref bean="car"/>
<ref bean="car2"/>
</util:list>
<bean id="person4" class="org.mybatis.xwb.po.Person">
<property name="name" value="Jack"></property>
<property name="age" value="29"></property>
<property name="cars" ref="cars"></property>
</bean>
p命名空间为bean的属性赋值
public class Person{
private String name;
private int age;
private List<Car> cars;
xml配置:
<!-- 通过p命名空间为bean的属性赋值,需要先导入p命名空间,相对于传统的配置方式更加的简洁 -->
<bean id="person5 " class="org.mybatis.xwb.po.Person"p:age="34"
p:name="sdfd" p:cars-ref="cars">
</bean>