Spring IOC使用详解
SpringIOC使用详解
一、IOC简介
IOC(Inversion of Control):控制反转,即对象创建的问题。通俗地讲就是把创建对象的代码交给了Spring的配置文件来进行的。这样做的优点是大大降低的代码的耦合度。
二、底层原理
为了方便对IOC的理解和使用,我们先来介绍一下IOC的原理。
IOC操作底层原理使用的技术如下:
- xml配置文件
- dom4j(解决xml问题)
- 工厂设计模式(用于创建对象)
- 反射(用于创建对象)
前两点很好理解,接下来我们来用代码实现一下工厂设计模式和反射创建。
首先我们需要一个User类,代码如下:
public class User {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
最初阶段,我们如果创建一个对象肯定都是利用 new User()来创建对象。而现在,为了降低耦合度,我们需要同过反射和工厂模式来创建一个对象。
下面通过反射和工厂模式来创建一个类
/**
* 创建工厂类
* **/
public class Factory {
//创建返回User对象的方法
public static User getUser() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
String classValue="com.testWeb.daomain.User";
//使用反射的方法创建对象
Class aClass=Class.forName(classValue);
User user= (User) aClass.newInstance();
return user;
}
}
通过测试类测试
public class testSpring {
@Test
public void test() throws IllegalAccessException, InstantiationException, ClassNotFoundException {
System.out.println(Factory.getUser());
}
}
输出结果:
在Spring中,我们只需要通过配置xml文件,就可以轻松创建对象了,是不是非常简单!
接下来,我们来进行代码演示Spring的IOC
三、代码示例
IOC创建实例对象有两种方法,一种是配置文件创建,另一种是注解的方法创建,在实际开发中我们主要使用,配置文件来创建对象。
1.配置文件创建
这里我们需要三步:
第一步、创建配置文件
我们在根目录下创applicationContext.xml(PS:名称可以不唯一)的配置文件,并且主体部分如下,
<?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">
</beans>
如果您使用的是idea编译器,可以鼠标右键轻松创建配置文件
第二步、创建类。(我们之前创建了User类,这里就不演示了)
第三步、配置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.xsd">
<!--
id:用于SpringIOC调用,可以为任意
class:类的全路径
scope:作用范围,scope不是必填属性,不写的默认值单例。为创建对象的方式,有两种结果:
1.singleton默认值,单实例。(常用)
2.prototype 多实例。(常用)
3.request:作用于 web 应用的请求范围
4.session:作用于 web 应用的会话范围
5.global-session:作用于集群环境的会话范围(全局会话范围),当不是集群环境时,就是session
-->
<bean id="user" class="com.testWeb.daomain.User" scope="prototype"></bean>
</beans>
第四步、写测试代码测试
public class testSpring {
@Test
public void testIOC(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
User user1= (User) context.getBean("user");
User user2=(User) context.getBean("user");
System.out.println(user1+user2);//如果scope为单例,两个对象的地址相同,多例效果则相反
}
}
其实,除了上述默认创建实例的方法外还有另一种不常用的实例工厂创建对象的方法:
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.xsd">
<!--实例工厂创建-->
<bean id="factory" class="com.testWeb.daomain.BeanFactory"></bean>
<bean id="bean" factory-bean="factory" factory-method="getBean" ></bean>
</beans>
BeanFactory类
public class BeanFactory{
public BeanFactory getBran (){
return new BeanFactory;
}
}
2.注解创建
首先来指出四种创建对象的四种注解方式:(四种注解本质上创建对象的方法是相同的,名称只是起到了清晰用途的作用)
首先是@Component注解创建,它又衍生出了三种注解:
-
@Controller :web层
-
@Service :service层
-
@repository:持久层
接下来进行代码操作
第一步、开启注解扫描
<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- base-package:标注扫描的路径 --> <!--开启注解扫描--> <context:component-scan base-package="com.testWeb"></context:component-scan> </beans>
第二步、为创建的类添加注解
package com.testWeb.daomain; import org.springframework.stereotype.Component; //value用于用于SpringIOC调用,可以为任意,和bean的id作用一样 //Scope和配置文件中的Scope一致,这里的意思为创建的实例对象为多实例。 @Component(value = "person") @Scope(value = "prototype") public class Person { public void test(){ System.out.println("test"); } }
第三步、添加测试代码
public class testSpring { @Test public void testIOC(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); Person person= (Person) context.getBean("person"); person.test(); } }