一.IOC(Inversion of Control,控制反转),获得依赖对象的方式反转了(所以也可以叫做DI依赖注入),传统方式是自己主动new一个object来获得对象,而使用spring IOC则是将获得对象的过程交给spring来实现,以此来解耦,换句话说,就是由spring来负责控制对象的生命周期和对象间的关系。
二.spirng IOC的2种方式:
a.set方式注入
b.构造器方式注入。
三.下面会分别演示传统的xml配置方式和基于注解的配置方式。
首先是实体类
Student.java
public class Student {
private int id;
private String name;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
然后是DAO层
StudentDao.javaimport com.example.entity.Student;
public interface StudentDao {
public void callMe();
public void addOneStudent(Student student);
}
StudentDaoImpl.java
public class StudentDaoImpl implements StudentDao {
@Override
public void callMe() {
System.out.println("you have called me~~");
}
@Override
public void addOneStudent(Student student) {
System.out.println("you have added a new student~~"+student.getId() + "--" + student.getName() + "--" + student.getSex());
}
}
set注入方式
SetDI.java
public class SetDI {
private StudentDao studentDao;
private Student student;
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
System.out.println("set方式注入studentDao");
}
public void setStudent(Student student) {
this.student = student;
System.out.println("set方式注入student");
}
public void callMe() {
studentDao.callMe();
}
public void addOneStudent() {
studentDao.addOneStudent(student);
}
}
xml配置
applicationContext.xml配置bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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" xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<bean name="studentDao" class="com.example.dao.impl.StudentDaoImpl"/>
<bean name="student" class="com.example.entity.Student">
<property name="id" value="1"></property>
<property name="name" value="mike"></property>
<property name="sex" value="male"></property>
</bean>
<!--set注入-->
<bean name="setDI" class="com.example.DI.set.SetDI">
<property name="studentDao" ref="studentDao"></property>
<property name="student" ref="student"></property>
</bean>
</beans>
测试类
Test.javapublic class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
SetDI testSet = (SetDI) applicationContext.getBean("setDI");
testSet.addOneStudent();
}
}
ConsDI.java
public class ConsDI {
private StudentDao studentDao;
private Student student;
public ConsDI(StudentDao studentDao, Student student) {
this.studentDao = studentDao;
this.student = student;
System.out.println("构造方式注入student和studentDao");
}
public void addOneStudent() {
studentDao.addOneStudent(student);
}
}
xml配置
applicationContext.xml<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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" xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<!-- 启用spring mvc 注解 -->
<context:annotation-config />
<!-- scan the package and the sub package -->
<context:component-scan base-package="com.example"/>
<bean name="studentDao" class="com.example.dao.impl.StudentDaoImpl"/>
<bean name="student" class="com.example.entity.Student">
<property name="id" value="1"></property>
<property name="name" value="mike"></property>
<property name="sex" value="male"></property>
</bean>
<!--构造器注入-->
<bean name="consDI" class="com.example.DI.constructor.ConsDI">
<constructor-arg ref="studentDao"></constructor-arg>
<constructor-arg ref="student"></constructor-arg>
</bean>
</beans>
Test.java
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
ConsDI testCons = (ConsDI) applicationContext.getBean("consDI");
testCons.addOneStudent();
}
}
基于注解的方式
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
一些注解相关知识在这篇博客里面点击打开链接
Student.java
@Component
public class Student {
private int id;
private String name;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
@Repository
public class StudentDaoImpl implements StudentDao {
@Override
public void callMe() {
System.out.println("you have called me~~");
}
@Override
public void addOneStudent(Student student) {
System.out.println("you have added a new student~~"+student.getId() + "--" + student.getName() + "--" + student.getSex());
}
}
基于注解的set注入
SetDI.java
@Service
public class SetDI {
private StudentDao studentDao;
private Student student;
@Autowired
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
System.out.println("set方式注入studentDao");
}
@Autowired
public void setStudent(Student student) {
this.student = student;
System.out.println("set方式注入student");
}
public void callMe() {
studentDao.callMe();
}
public void addOneStudent() {
studentDao.addOneStudent(student);
}
}
基于注解的构造器注入
ConsDI.java
@Service
public class ConsDI {
private StudentDao studentDao;
private Student student;
@Autowired
public ConsDI(StudentDao studentDao, Student student) {
this.studentDao = studentDao;
this.student = student;
System.out.println("构造方式注入student和studentDao");
}
public void addOneStudent() {
studentDao.addOneStudent(student);
}
}
需要开启注解并扫描要使用的注解包下的类
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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" xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<!-- 启用spring mvc 注解 -->
<context:annotation-config />
<!-- scan the package and the sub package -->
<context:component-scan base-package="com.example"/>
<!--并不需要这个bean这里只是方便set数据 -->
<bean name="student" class="com.example.entity.Student">
<property name="id" value="1"></property>
<property name="name" value="mike"></property>
<property name="sex" value="male"></property>
</bean>
</beans>
Test.java
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
SetDI testSet = (SetDI) applicationContext.getBean("setDI");
testSet.addOneStudent();
ConsDI testCons = (ConsDI) applicationContext.getBean("consDI");
testCons.addOneStudent();
}
}