1. 介绍IOC
IOC就是控制反转,听上去很高大上,其实简单说,就是以前手动创建对象的实例,现在由spring代理你创建这个实例
2.HelloWorld
这里写了3个类和一个spring xml配置文件,
- UserService.java - 接口
- UserServiceImpl.java - 实现类
- UserServiceTest.java - 测试类
- springConfig.xml - spring配置文件
UserService.java
public interface UserService { /** * 添加用户 */ void addUser(); }
UserServiceImpl.java
public class UserServiceImpl implements UserService{/** * 实现接口方法 */ public void addUser() { System.out.println("添加用户成功"); } }
springConfig.xml
<?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-4.3.xsd"> <bean id="userServiceBean" class="com.test.spring.ioc.UserServiceImpl"></bean> </beans>
UserServiceTest.java
import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserServiceTest { @Test public void test() { //以前 //UserService userService = new UserServiceImpl(); //userService.addUser(); /** * spring的写法,这是一个工厂类,这里有一个参数,参数对应配置文件的classpath位置,src为根目录 */ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/com/test/spring/ioc/springConfig.xml"); //这里的参数为 配置文件中 bean id,意思就是获取 对应id实例对象 UserService us = (UserService)context.getBean("userServiceBean"); us.addUser(); } }
3.作用域
在默认情况下,spring创建的所有对象都是单例,可以通过从以下的测试方法,可以得出结论
//创建对象1
UserService us_1 = (UserService)context.getBean("userServiceBean"); System.out.println(us_1);
//创建对象2 UserService us_2 = (UserService)context.getBean("userServiceBean"); System.out.println(us_2);
/**
*打印的结果为可以看出两个对象都是同一个
*
*/
如果想要创建多实例,那就需要修改他的作用域
- singleton(默认)单例
- prototype 多例
- request 没研究
- session 没研究
- global session 没研究
在配置文件bean 添加scope属性修改为prototype,重新执行上面的测试方法,结果就是两个对象都不一样
<?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-4.3.xsd"> <bean id="userServiceBean" class="com.test.spring.ioc.UserServiceImpl" scope="prototype"></bean> </beans>
在单例的情况下,当你执行读取配置文件的时候,对象将会立即创建,但如果是多例的情况下,只有在执行getBean的情况下,才会被新建,可以通过以下方式来测试一下
public class UserServiceImpl implements UserService{ /** * 可以不加这个构造函数,添加上这个构造函数的目的是测试实例化的生命周期 */ public UserServiceImpl() { System.out.println("实例化"); } /** * 实现接口方法 */ public void addUser() { System.out.println("添加用户成功"); } }
4. 创建bean的方式
- 默认方式 - <bean id="" class="">
- 静态工厂 - 就是在一个静态类(里面所有方法都是静态的)里面提供一个静态方法,用于创建对象实例
配置的写法
<?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-4.3.xsd"> <!-- 静态工厂创建bean方式 --> <bean id="userServiceBean" class="com.test.spring.factory.MyFactory" factory-method="createUserService"></bean> </beans>
工厂MyFactory.java
/** * 静态工厂 * */ public class MyFactory { /** * 创建一个userservice实例 * @return */ public static UserService createUserService() { return new UserServiceImpl(); } }
- 实例工厂 - 在一个非静态类里面,提供一个方法用于创建对象实例
配置写法
<?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-4.3.xsd"> <!-- 实例工厂创建bean方式 --> <bean id="instanceFactoryBean" class="com.test.spring.factory.MyFactoryInstance"></bean>
<!-- 通过上面的实例bean,调用里面的方法 --> <bean id="userServiceBean2" factory-bean="instanceFactoryBean" factory-method="createUserServiceInInstanceFactory"></bean> </beans>
实例工厂
/** * 实例工厂 * */ public class MyFactoryInstance { public UserService createUserServiceInInstanceFactory() { return new UserServiceImpl(); } }