2) Student
public class Student extends Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Demo [name=" + name + "]"; } }
3) 配置文件
<bean id="student" class="org.lisen.springdemo.model.Student" parent="person"> <property name="name"> <value>张三</value> </property> </bean> <bean id="person" class="org.lisen.springdemo.model.Person" abstract="true"> <property name="phone"> <value>139751878778</value> </property> </bean>
4) 通过Spring的ApplicationContext获取Bean
public class SpringDemo { public static void main(String[] args) { ApplicationContext cxt = new ClassPathXmlApplicationContext("spring.xml"); Student student = (Student)cxt.getBean("student"); System.out.println(student.getName()); System.out.println(student.getPhone()); } }
4.4.3 使用有参数构造方法创建javaBean
constructor-arg
1) Worker
public class Worker extends Person { private String workName; public Worker(String workName) { this.workName = workName; } public String getWorkName() { return workName; } public void setWorkName(String workName) { this.workName = workName; } }
2)配置文件
<bean id="worker" class="org.lisen.springdemo.model.Worker" parent="person"> <constructor-arg name="workName"> <value>王小</value> </constructor-arg> <!-- 第二种方式 <constructor-arg index="0"> <value>王小</value> </constructor-arg> --> </bean>
3) 通过Spring的ApplicationContext获取Bean
public class SpringDemo { public static void main(String[] args) { ApplicationContext cxt = new ClassPathXmlApplicationContext("spring.xml"); Student student = (Student)cxt.getBean("student"); System.out.println(student.getName()); System.out.println(student.getPhone()); //构造函数注入 Worker worker = (Worker)cxt.getBean("worker"); System.out.println(worker.getWorkName()); } }
4.4.4 init-method:指定bean的初始化方法
- 修改上面的Student类,加入一个init方法,注意该方法不能有参数
public class Student extends Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Demo [name=" + name + "]"; } //init方法,不能有参数 public void init() { System.out.println("Student init ...."); } }
2) 修改Student类对应的配置文件
<bean id="student" class="org.lisen.springdemo.model.Student" parent="person" init-method="init"> <property name="name"> <value>张三</value> </property> </bean>
3) 运行原来的测试用例,会发生后台打印“Student init ....“,表示init-method正常调用。
4.4.5 复杂属性的配置
1) JavaBean属性注入
<bean id="student" class="org.lisen.springdemo.model.Student" parent="person" init-method="init"> <property name="name"> <value>张三</value> </property> <property name="addr" ref="addr"/> </bean> <bean id="addr" class="org.lisen.springdemo.model.Addr"> <property name="city"> <value>长沙</value> </property> </bean>
java部分代码比较简单,请根据配置文件自行完成。
2)List或数组
声明属性
private int[] arr; private List list;
配置文件
<property name="list"> <list> <value>123</value> <value>456</value> <value>789</value> <value>asd</value> </list> </property>
3)Map
private Map map;
配置文件
<property name="map"> <map> <entry key="aa" value="123"/> <entry key="bb" value="456"/> <entry key="cc" value="789"/> </map> </property>
4.Properties
private Properties prop;
配置文件
<property name="prop"> <props> <prop key="dd">qwer</prop> <prop key="ee">tyu</prop> <prop key="ff">iop</prop> </props> </property>
5. 多配置文件
系统一般会被分成多个模块,可以为每个模块配置一个配置文件,便于管理,在版本控制软件中也可以减少冲突
spring-a.xml 假设为a模块的配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> <bean id="student" class="org.lisen.springdemo.model.Student" parent="person" init-method="init"> <property name="name"> <value>张三</value> </property> <property name="addr" ref="addr"/> </bean> <bean id="addr" class="org.lisen.springdemo.model.Addr"> <property name="city"> <value>长沙</value> </property> </bean> <bean id="person" class="org.lisen.springdemo.model.Person" abstract="true"> <property name="phone"> <value>139751878778</value> </property> </bean> <bean id="worker" class="org.lisen.springdemo.model.Worker" parent="person"> <constructor-arg name="workName"> <value>王小</value> </constructor-arg> <!-- 第二种方式 <constructor-arg index="0"> <value>王小</value> </constructor-arg> --> </bean> </beans>
spring.xml 为总的spring配置文件, 在总配置文件中导入其他模块即可。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> <import resource="spring-a.xml"/> </beans>
6. 与web集成
6.1 集成配置
在web.xml中加入如下配置:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
6.2 获取配置的Bean
/** * 用于简化Bean的获取. * * ApplicationContextAware接口: * 实现了这个接口的bean,当spring容器初始化的时候,会自动的将ApplicationContext注入进来 * * @author Administrator */ public final class SpringBeanUtil implements ApplicationContextAware { private SpringBeanUtil() { } private static ApplicationContext cxt; @Override public void setApplicationContext(ApplicationContext appContext) throws BeansException { cxt = appContext; } /** * 根据Bean的id来获取Bean对象 * @param id 配置文件中的bean的id属性 * @return Object */ @SuppressWarnings("unchecked") public static <T> T getBean(String id) { return (T)cxt.getBean(id); } }
配置文件
<bean class="org.lisen.springdemo.util.SpringBeanUtil"/>