1. 导入Spring开发的基本包坐标(导入坐标)
2. 编写Dao接口和实现类(创建Bean)
3. 创建Spring核心配置文件(applicationContext.xml)
4. 在Spring配置文件中配置UserDaoImpl
5. 创建ApplicationContext对象getBean
先建一个测试类
测试代码:
测试结果:
1.Bean标签基本配置
基本属性:
id:Bean实例在Spring容器中的唯一标识
class:Bean的全限定名称
2.Bean标签范围配置
scope:指对象的作用范围,取值如下:
- 当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当Spring核 心文件被加载时,实例化配置的Bean实例
Bean的生命周期:
对象创建:当应用加载,创建容器时,对象就被创建了
对象运行:只要容器在,对象一直活着
对象销毁:当应用卸载,销毁容器时,对象就被销毁了
测试1:
测试代码:
package com.xc.test;
import com.xc.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
@Test
//测试scope属性
public void test1(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");//这里的参数指的是刚刚Spring配置文件
UserDao userDao1 = (UserDao) app.getBean("userDao");
UserDao userDao2 = (UserDao) app.getBean("userDao");
System.out.println(userDao1);
System.out.println(userDao2);
}
}
测试结果:
地址一样说明在Spring容器中user的Bean只存在一个
- 当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()方法时实例化Bean
对象创建:当使用对象时,创建新的对象实例
对象运行:只要对象在使用中,就一直活着
对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了
测试2:
测试代码:
package com.xc.test;
import com.xc.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
@Test
//测试scope属性
public void test1(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");//这里的参数指的是刚刚Spring配置文件
UserDao userDao1 = (UserDao) app.getBean("userDao");
UserDao userDao2 = (UserDao) app.getBean("userDao");
System.out.println(userDao1);
System.out.println(userDao2);
}
}
测试结果:
地址不一样说明在Spring容器中user的Bean存在多个
3.Bean生命周期配置
有两个属性控制,分别是:
- init-method:指定类中的初始化方法
- destroy-method:指定类中的销毁方法
测试示例:
package com.xc.test;
import com.xc.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
@Test
//测试scope属性
public void test1(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");//这里的参数指的是刚刚Spring配置文件
UserDao userDao1 = (UserDao) app.getBean("userDao");
System.out.println(userDao1);
((ClassPathXmlApplicationContext) app).close();
}
}
测试结果:
4.Bean实例化的三种方式
-
无参构造方法实例化
对象可以被创建 -
工厂静态方法实例化
测试结果:
对象一样可以被创建 -
工厂实例方法实例化
测试结果:
对象一样可以被创建
5.Bean的依赖注入
因为UserService和UserDaoImpl都在Spring容器中,而最终程序直接使用的是UserService,所以可以在Spring容器中,将UserDao设置到UserService内部。
定义:
依赖注入(Dependency Injection):它是Spring框架核心IOC的具体实现。
在编写程序时通过控制反转把对象的创建交给了Spring,但是代码中不可能出现没有依赖的情况,IOC解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。这种业务层和持久层的依赖关系在使用Spring之后就让Spring来维护了,简单说就是坐等框架把持久层对象传入业务层而不用我们自己去获取。
Bean的依赖注入方式有两种:
- 构造方法
代码示例:
package com.xc.service.impl;
import com.xc.dao.UserDao;
import com.xc.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
public UserServiceImpl(){
}
public void save() {
userDao.save();//这样就不用自己从容器获得Dao,在容器内部通过set方法将Dao注入了
}
}
但是Spring不知道,所以我们需要在Spring配置文件中告诉Spring
代码示例:
测试结果:
- set方法
代码示例:
package com.xc.service.impl;
import com.xc.dao.UserDao;
import com.xc.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save() {
// ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");//这里的参数指的是刚刚Spring配置文件
// UserDao userDao = (UserDao) app.getBean("userDao");
// userDao.save();
userDao.save();//这样就不用自己从容器获得Dao,在容器内部通过set方法将Dao注入了
}
}
但是Spring不知道,所以我们需要在Spring配置文件中告诉Spring
代码示例:
测试结果:
Bean的依赖注入的数据类型
上面的内容都是注入的引用Bean,除了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。
注入数据的三种数据类型:
- 普通数据类型
package com.xc.dao.impl;
import com.xc.dao.UserDao;
public class UserDaoImpl implements UserDao {
private String username;
private int age;
public void setAge(int age) {
this.age = age;
}
public void setUsername(String username) {
this.username = username;
}
public void save() {
System.out.println(username + "======" + age);
System.out.println("save running...");
}
}
但是Spring不知道,所以我们需要在Spring配置文件中告诉Spring
测试结果:
- 引用数据类型
例子同上
- 集合数据类型
代码示例:
package com.xc.dao.impl;
import com.xc.dao.UserDao;
import com.xc.domain.User;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class UserDaoImpl implements UserDao {
private List strList;
private Map userMap;
private Properties properties;
public List getStrList() {
return strList;
}
public void setStrList(List strList) {
this.strList = strList;
}
public Map getUserMap() {
return userMap;
}
public void setUserMap(Map userMap) {
this.userMap = userMap;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public String getUsername() {
return username;
}
public int getAge() {
return age;
}
private String username;
private int age;
public void setAge(int age) {
this.age = age;
}
public void setUsername(String username) {
this.username = username;
}
public void save() {
System.out.println(strList);
System.out.println(userMap);
System.out.println(properties);
System.out.println("save running...");
}
}
但是Spring不知道,所以我们需要在Spring配置文件中告诉Spring
代码示例:
aaa bbb ccc pp1 pp2 pp3
测试结果:
6.引入其他配置文件(分模块开发)
实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件中通过import标签进行加载



