Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转,哪些方面反转了:
●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
ApplicationContext容器中的接口的继承关系,ApplicationContext是BeanFactory的子接口之一,即BeanFactory是Spring IOC容器定义的最底层的接口,ApplicationCentext是BeanFactory的高级实现之一,是对BeanFactory功能做了许多的扩展。
配置bean的方式:
(1).通过ApplicationContext上下文容器:当在加载xml配置文件时,配置文件中的配置的bean已经被实例化
(2).BeanFactory:在加载配置文件时,配置文件中的bean不被实例化,只有当通过getBean(),获取bean实例的时候才被创建。
主要使用的三种创建IOC的方式:
1.ClassPathXmlApplicationContext
读取classpath中的资源
new ClassPathXmlApplicationContext(".xml配置文件");
2.FileSystemXmlAplicationContext
读取指定路径下的资源
new FileSystemXmlApplicationContext("/指定路径");
3.XmlWebAplicationContext
需要在Web环境下读取资源
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>4.3.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-beansartifactId>
<version>4.3.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>4.3.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-expressionartifactId>
<version>4.3.2.RELEASEversion>
dependency>
在resources目录下给定xml配置文件,命令为application.xml
<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-3.0.xsd">
beans>
package com.tulun.bean;
public class Person {
private String name;
private int id;
public Person(){
}
public Person(String name,int id){
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", id=" + id +
", person1=" + person1 +
'}';
}
//此处省略set和get方法
}
配置在application.xml文件中;
<bean id="person1" class="com.tulun.bean.Person"/>
id->创建的对象名
class->实例类所在地址
确保实例类中存在无参构造函数,否则无法实例化成功
测试(App.java)
//无参构造方法的实例化
public void demo1(){
//获取IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
//在容器中获取需要的对象
Person person = (Person) context.getBean("person1");
System.out.println(person);
}
1.创建静态工厂类
package com.tulun.factory;
import com.tulun.bean.Person;
public class StaticFactory {
public static Person getPerson(){
return new Person();
}
}
2.配置xml文件(application.xml)
<bean id="person2" class="com.tulun.factory.StaticFactory" factory-method="getPerson"/>
class属性指定的静态工厂类的全路径 ,factory-method属性即对应的方法,当前获取Person类在静态工厂下提供的getPerson方法可获取该对象
3.测试(App.java)
//静态工厂实例化
public void demo2(){
//获取IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
//在容器中获取需要的对象
Person person = (Person) context.getBean("person2");
System.out.println(person);
}
1.创建普通工厂类
package com.tulun.factory;
import com.tulun.bean.Person;
public class CommonFactory {
public Person getPerson(){
return new Person();
}
}
2.配置xml文件(application.xml)
<bean id="factory" class="com.tulun.factory.CommonFactory"/>
<bean id="person3" factory-bean="factory" factory-method="getPerson"/>
3.测试(App.java)
//实例工厂实例化
public void demo3(){
//获取IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
//在容器中获取需要的对象
Person person = (Person) context.getBean("person3");
System.out.println(person);
}
在resources目录下给定xml配置文件,命令为application1.xml
<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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="com.tulun"/>
beans>
开启注解扫描:在指定的包路径下所有的类名,属性等上的注解都会进行扫描
@Component
public class Person {
private String name;
private int id;
}
测试(App.java)
//通过注解实例化
public void demo4(){
//获取IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("application1.xml");
//在容器中获取需要的对象
Person person = (Person) context.getBean("person");
System.out.println(person);
}
使用注解很方便,在配置问价中指定扫描的包路径或者类路径后,另交给IOC管理的类上直接添加注解@Component
Spring中提供的4中注解来标注bean
@Component 通用的标注的注解
@Repository 对dao层实现类进行标注
@Service 对service层实现类进行标注
@Controller 对Controller层实现类进行标注
@Component 是spring提供的通用的组件注解
@Repository、@Service 、@Controller都是有其衍生出来,功能都是一样的,可以互换,
主要是为了区分被注解的类处在不同的业务层,使逻辑更加清晰
以下是对Spring DI 的简单介绍及使用:
添加链接描述