spring的技术核心是IOC(控制反转),DI(依赖注入)以及AOP(面向切面编程)
可以通过spring框架帮我们生成对象
spring可用在java工程里,也可以用在web工程中。
首先找需要的jar包。有spring.jar,commons-logging.jar包,然后拷贝一个applicationContext.xml。也可以通过myeclipse自动完成.
空的applicationContext.xml文件内容如下
<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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
</beans>
通过下面语句加载applicationContext.xml
BeanFactory bf= new ClassPathXmlApplicationContext("applicationContext.xml");
其中BeanFactory是org.springframework.beans.factory.BeanFactory
而ClassPathXmlApplicationContext是org.springframework.context.support.ClassPathXmlApplicationContext。它的构造方法接收一个配置文件,如果不写会默认为applicationContext.xml。写了就会去找相应的xml文件。也就是说这个applicationContext.xml名称不是固定的,是可以改的。
在加载配置文件的过程中会自动创建配置文件中的Bean。比如:
<bean name="userDaoImpl" class="com.ts.dao.imp.UserDaoImpl"></bean>
<bean name="user" class="com.ts.vo.User"></bean>
会自动调用UserDaoImpl和User的无参构造来创建userDaoImpl和user的两个实例。
通过Set方法进行注入。比如在配置文件中做了如果下配置
<bean name="userDaoImpl" class="com.ts.dao.imp.UserDaoImpl"></bean>
<bean id="userDaoServiceImp" class="com.ts.dao.service.imp.UserDaoServiceImp">
<!-- 定义setxxx方法进行注入 -->
<property name="userDaoImpl" ref="userDaoImpl"></property>
</bean>
加载配置文件时会自动创建UserDaoImpl的实例userDaoImpl,UserDaoServiceImp的实例userDaoServiceImp。因为
在userDaoServiceImp这个bean中指定了Property。property的name一定要是UserDaoServiceImp类中的成员名,ref指定(在配置文件中就行)name为‘userDaoImpl’的bean。UserDaoServiceImp类一定要给userDaoImpl加上setter方法。
UserDaoServiceImp类代码如下:
package com.ts.dao.service.imp;
import java.util.List;
import com.ts.dao.imp.UserDaoImpl;
import com.ts.service.UserDaoService;
import com.ts.vo.User;
public class UserDaoServiceImp implements UserDaoService {
private UserDaoImpl userDaoImpl;
public UserDaoServiceImp() {
super();
}
public UserDaoImpl getUserDaoImpl() {
return userDaoImpl;
}
public void setUserDaoImpl(UserDaoImpl userDaoImpl) {
this.userDaoImpl = userDaoImpl;
System.out.println("setXXX");
}
public UserDaoServiceImp(UserDaoImpl userDaoImpl) {
super();
this.userDaoImpl = userDaoImpl;
System.out.println("daichangouzao");
}
public void deleteUser(User user) {
// TODO Auto-generated method stub
userDaoImpl.deleteUser(user);
}
public List<User> getAllUser() {
// TODO Auto-generated method stub
return userDaoImpl.getAllUser();
}
public void insertUser(User user) {
// TODO Auto-generated method stub
userDaoImpl.insertUser(user);
}
public void updateUser(User user) {
// TODO Auto-generated method stub
userDaoImpl.updateUser(user);
}
}
<!-- 根据实例工厂创建bean -->
<bean name="objFactory" class="com.ts.factory.ObjectFactory"></bean>
<bean name="userDaoImpl1" factory-bean="objFactory" factory-method="createUserDaoImp"></bean>
即com.ts.factory.ObjectFactory类的createUserDaoImp方法返回一个对象名为userDaoImpl1的实例。ObjectFactory代码如下
package com.ts.factory;
import com.ts.dao.imp.UserDaoImpl;
public class StaticObjectFactory {
public static UserDaoImpl createUserDaoImp(){
System.out.println("jingtai gong chang");
return new UserDaoImpl();
}
}
<!-- 根据静态工厂创建bean -->
<bean name="userDaoImpl2" class="com.ts.factory.StaticObjectFactory" factory-method="createUserDaoImp"></bean>
即com.ts.factory.StaticObjectFactory类的静态方法createUserDaoImp返回一个对象名为userDaoImpl2的实例。ObjectFactory代码如下
package com.ts.factory;
import com.ts.dao.imp.UserDaoImpl;
public class StaticObjectFactory {
public static UserDaoImpl createUserDaoImp(){
System.out.println("jingtai gong chang");
return new UserDaoImpl();
}
}
<!-- 调用构造方法进行注入 -->
<bean id="userDaoServiceImp1" class="com.ts.dao.service.imp.UserDaoServiceImp">
<constructor-arg ref="userDaoImpl"></constructor-arg>
</bean>
通过带一个参数的.UserDaoServiceImp的构造方法创建一个对象名为userDaoServiceImp1的实例。userDaoImpl是配置文件中的一个Bean的name。
类UserDaoServiceImp的代码如上。
Person类代码如下:
public class Person {
private String name;
private int age;
private String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
配置文件如下:基本属性值注入
<bean name="person" class="com.ts.vo.Person">
<property name="name" value="张三"></property>
<property name="age" value="18"></property>
<property name="gender" value="男"></property>
</bean>
加载代码执行如下
BeanFactory bf= new ClassPathXmlApplicationContext("applicationContext.xml");
Person p = (Person)bf.getBean("person");
System.out.println(p.getName()+"-----"+p.getAge()+"----"+p.getGender());
控制台输出如下:张三-----18----男
对数组属性的注入。在Person中加一个数组类的属性
private String[] info;
public String[] getInfo() {
return info;
}
public void setInfo(String[] info) {
this.info = info;
}
配置文件如下:
<property name="info">
<list>
<value>info1</value>
<value>info2</value>
<value>info3</value>
</list>
</property>
List集合注入
private List<String> list;
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
配置文件如下:
<property name="list">
<list>
<value>list1</value>
<value>list2</value>
<value>list3</value>
</list>
</property>
set集合的注入
private Set<String> set;
public Set<String> getSet() {
return set;
}
public void setSet(Set<String> set) {
this.set = set;
}
<property name="set">
<set>
<value>set1</value>
<value>set2</value>
<value>set3</value>
</set>
</property>
for(String info:p.getInfo()){
System.out.println(info);
}
for(String info:p.getList()){
System.out.println(info);
}
for(String info:p.getSet()){
System.out.println(info);
}
结果:
张三-----18----男
info1
info2
info3
list1
list2
list3
set1
set2
set3
Map集合的注入Person类增加下面代码
private Map<String,Integer> map;
public Map<String, Integer> getMap() {
return map;
}
public void setMap(Map<String, Integer> map) {
this.map = map;
}
配置文件增加下面内容
<property name="map">
<map>
<entry key="key1" value="100"></entry>
<entry key="key2" value="200"></entry>
<entry key="key3" value="300"></entry>
</map>
</property>
测试代码如下
Map<String,Integer> map= p.getMap();
Set<String> kSet = map.keySet();
Iterator<String> it = kSet.iterator();
while(it.hasNext()){
String key = it.next();
Integer value=map.get(key);
System.out.println(key+"----"+value);
}
输出结果
key1----100
key2----200
key3----300