1 Spring中bean的配置
1.1 <bean>标签的id和name区别
- id :使用了约束中的唯一约束。里面不能出现特殊字符的。
- name :没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。比如Spring和Struts整合的时候<bean name="/user" class="xxx.xxx.xxx">
1.2 Bean生命周期的配置
- init-method :Bean被初始化的时候执行的方法
- destroy-method :Bean被销毁的时候执行的方法(Bean在默认情况下是单例创建,工厂关闭)
1.3 Bean作用范围的配置
- singleton :默认的,Spring会采用单例模式创建这个对象。
- prototype :多例模式。(Struts2和Spring整合会用到,因为Action是多例的)
- request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
- session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
- globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
1.4 示例
1.4.1 bean的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.itykd.dao.impl.UserDaoImpl" scope="prototype" init-method="init" destroy-method="destory"/>
</beans>
1.4.2 示例Demo
package com.itykd.spring;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.itykd.dao.UserDao;
public class SpringDemo {
public void configurationDemo() {
//创建Spring的工厂
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) applicationContext.getBean("userDao");
UserDao userDao2 = (UserDao) applicationContext.getBean("userDao");
userDao1.save();
userDao2.save();
System.out.println(userDao1==userDao2);
applicationContext.close();
}
}
因为配置的多例的形式,因此会初始化两次,userDao1和userDao2是两个对象,System.out.println(userDao1==userDao2)输出为false
2 Spring的bean管理
2.1 Spring的bean的实例化方式
2.1.1 无参构造方法的方式(默认)
- 构造方法编写
package com.itykd.bean;
public class Bean {
public Bean() {
super();
System.out.println("Bean1的无参构造方法执行了......");
}
}
- bean的配置
<bean id="bean" class="com.itykd.bean.Bean" />
- 利用spring工厂创建bean
public void beanInstanceByConstruction() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Bean1 bean1=(Bean1)applicationContext.getBean("bean");
}
2.1.2 静态工厂实例化方式
- 静态工厂
package com.itykd.bean;
public class BeanStaticFatory {
public static Bean createBean() {
System.out.println("BeanStaticFatory的createBean方法执行了.....");
return new Bean();
}
}
- bean的配置
<bean id="beanStaticFactory" class="com.itykd.bean.BeanStaticFatory" factory-method="createBean"/>
- 创建bean
public void beanInstanceByStaticFactory() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Bean bean1=(Bean)applicationContext.getBean("beanStaticFactory");
}
2.1.3 实例工厂实例化方式
- 实例工厂
package com.itykd.bean;
public class BeanFatory {
public Bean createBean() {
System.out.println("BeanFatory的createBean方法执行了.....");
return new Bean();
}
}
- bean配置
<bean id="beanFactory" class="com.itykd.bean.BeanFatory"></bean>
<bean id="bean2" factory-bean="beanFactory" factory-method="createBean"></bean>
- 创建bean
public void beanInstanceByFactory() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Bean bean1=(Bean)applicationContext.getBean("beanFactory");
}
2.2 Spring的属性注入
2.2.1 构造方法属性注入
- 带属性的构造方法
package com.itykd.bean;
public class User {
private String name;
private String password;
public User(String name, String password) {
super();
this.name = name;
this.password = password;
}
@Override
public String toString() {
return "User [name=" + name + ", password=" + password + "]";
}
}
- bean配置
<!-- 构造方法属性注入 -->
<bean id ="user" class="com.itykd.bean.User">
<constructor-arg name="name" value="Kobe"/>
<constructor-arg name="password" value="123"/>
</bean>
- 创建bean
public void beanAttributeByConstuctor() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User user=(User)applicationContext.getBean("user");
System.out.println(user);
}
2.2.2 set方法属性注入
- set方法
提供了set方法之后,不要写带属性的构造方法
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
- bean配置
<!-- set方法属性注入 -->
<bean id ="user1" class="com.itykd.bean.User">
<property name="name" value="ykd"/>
<property name="password" value="456"/>
</bean>
- set方法设置对象类型的属性
ref用来设置对象类型的属性,ref引用的是其他bean的id或者name
2.2.3 p名称空间属性注入(Spring2.5以后)
- 写法
- 对象属性 p:属性名-ref=”值”
- 普通属性 p:属性名=”值”
- p名称空间的引入
在xml文件上引入 xmlns:p="http://www.springframework.org/schema/p"
- set方法
p名称空间的注入需要提供属性的set方法
package com.itykd.bean;
public class Company {
private String name;
private String location;
private String level;
public void setName(String name) {
this.name = name;
}
public void setLocation(String location) {
this.location = location;
}
public void setLevel(String level) {
this.level = level;
}
@Override
public String toString() {
return "Company [name=" + name + ", location=" + location + ", level=" + level + "]";
}
}
- bean的配置
<bean id="company" class="com.itykd.bean.Company" p:name="阿里巴巴" p:location="杭州" p:level="BAT"/>
2.2.4 spEL属性注入(Spring3.0以后)
spEL:Spring Expression Language,spring的表达式语言,也要提供set方法才能注入属性
写法:#{spEL}
<bean id="car" class="com.itykd.bean.Car">
<property name="name" value="#{'宝马'}"/>
<property name="price" value="#{car.calculatePrice()}"/>
</bean>
<bean id="employee" class="com.itykd.bean.Employee">
<property name="name" value="#{'James'}"/>
<property name="car" value="#{car}"/>
</bean>
2.2.5 集合类型的属性注入
- 如果集合类中的属性是对象类型的话,对于list,数组和set来说,则就不用<value>标签,只用<ref>标签
- 对于map来说的话,用key-ref或者value-ref
- 也要提供set方法
package com.itykd.bean;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class CollectionBean {
private String[] arrs;
private List<String> list;
private Set<String> set;
private Map<String, String> map;
public void setArrs(String[] arrs) {
this.arrs = arrs;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
@Override
public String toString() {
return "CollectionBean [arrs=" + Arrays.toString(arrs) + ", list=" + list + ", set=" + set + ", map=" + map
+ "]";
}
}
- 配置bean
<bean id="collectionBean" class="com.itykd.bean.CollectionBean">
<!-- 数组类型 -->
<property name="arrs">
<list>
<value>Kobe</value>
<value>James</value>
<value>Wade</value>
</list>
</property>
<!-- 注入list集合 -->
<property name="list">
<list>
<value>Lakers</value>
<value>Clippers</value>
<value>Spurs</value>
</list>
</property>
<!-- 注入set集合 -->
<property name="set">
<list>
<value>IG</value>
<value>RNG</value>
<value>WE</value>
</list>
</property>
<!-- 注入map集合 -->
<property name="map">
<map>
<entry key="aaa" value="111"/>
<entry key="bbb" value="222"/>
<entry key="ccc" value="333"/>
</map>
</property>
</bean>