Spring的核心机制
管理Bean
程序主要是通过Spring容器来访问容器中的Bean,ApplicationContext是Spring容器最常用的接口,该接口有如下两个实现类:
ClassPathXmlApplicationContext: 从类加载路径下搜索配置文件,并根据配置文件来创建Spring容器。
FileSystemXmlApplicationContext: 从文件系统的相对路径或绝对路径下去搜索配置文件,并根据配置文件来创建Spring容器。
package com.xue.test;
import com.xue.service.BookService;
import com.xue.service.Impl.BookServiceImpl;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test01 {
BookService bookService;
@Test
public void Test01() {
//创建对象执行方法。对象的创建由Spring框架创建,此处可以直接问Ioc容器要就可以
//bookService = new BookServiceImpl();
//1.通过ClassPathXmlApplicationContext加载application.xml获取IOC容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
//2.从IOC容器中根据名字获取对象
bookService = (BookService) context.getBean("bookService");
bookService.save();
}
}
依赖注入=控制反转
Spring框架的核心功能有两个:
Spring容器作为超级大工厂,负责创建、管理所有的Java对象,这些Java对象被称为Bean。
Spring容器管理容器中Bean之间的依赖关系,Spring使用一种被称为"依赖注入"的方式来管理Bean之间的依赖关系。
当某个Java对象(调用者)需要调用另一个Java对象(被依赖对象)的方法时,在传统模式下通常有两种做法:
原始做法: 调用者主动创建被依赖对象,然后再调用被依赖对象的方法。
简单工厂模式: 调用者先找到被依赖对象的工厂,然后主动通过工厂去获取被依赖对象,最后再调用被依赖对象的方法。
注意:使用Spring框架之后,调用者无需主动获取被依赖对象,调用者只要被动接受Spring容器为调用者的成员变量赋值即可,由此可见,使用Spring后,调用者获取被依赖对象的方式由原来的主动获取,变成了被动接受——所以Rod Johnson称之为控制反转
1.创建项目,导入spring的jar包
![](https://i-blog.csdnimg.cn/blog_migrate/a4e6ad0dbb2ecff5faeb9830f66e6d7c.png)
2.按照如下目录结构创建接口及其实现类
![](https://i-blog.csdnimg.cn/blog_migrate/ca61bae7542383cb9731779a53bc3e07.png)
dao层代码
//接口
package com.xue.dao;
public interface BookDao {
void add();
}
//实现类
package com.xue.dao.Impl;
import com.xue.dao.BookDao;
public class BookDaoImpl implements BookDao {
@Override
public void add() {
System.out.println("BookDaoImpl....add");
}
}
service层代码
//接口
package com.xue.service;
public interface BookService {
void save();
}
//实现类
package com.xue.service.Impl;
import com.xue.dao.BookDao;
import com.xue.dao.Impl.BookDaoImpl;
import com.xue.service.BookService;
public class BookServiceImpl implements BookService {
//BookServiceImpl依赖bookDao的对象
private BookDao bookDao;
public String name;
private int age;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void save() {
System.out.println("BookServiceImpl...save"+"姓名:"+name+"年龄:"+age);
bookDao.add();
}
}
3.使用spring完成IOC的配置和DI依赖注入
创建spring的核心配置文件
<?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">
<!--告诉Spring框架,创建管理那些对象
id是给创建的对象起一个名字
class:要创建对象的全类名
-->
<bean id="bookDao" class="com.xue.dao.Impl.BookDaoImpl"/>
<bean id="bookService" class="com.xue.service.Impl.BookServiceImpl">
<!--使用property给类的属性注入数据:默认使用set方法
常规类型使用value注入
对象使用ref引用上边的定义
-->
<property name="name" value="之"/>
<property name="age" value="11"/>
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>
bean标签表示把对应class的对象创建到IOC容器中,如果当前对象有依赖的其他对象,那么可以通过property对依赖的对象使用ref引用容器中已经注册过的对象。
注意:BookServiceImpl需要给bookDao属性设置setter方法,框架才能自动注入
public class BookServiceImpl implements BookService {
//BookServiceImpl依赖bookDao的对象
private BookDao bookDao;
public String name;
private int age;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
4.在servlet中进行测试
1.首先获取IOC的容器;
2.从容器中获取bookService对象;
3.执行方法:servlet执行---service执行,由于spring完成了依赖注入------dao层执行
package com.xue.test;
import com.xue.service.BookService;
import com.xue.service.Impl.BookServiceImpl;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test01 {
BookService bookService;
@Test
public void Test01() {
//创建对象执行方法。对象的创建由Spring框架创建,此处可以直接问Ioc容器要就可以
//bookService = new BookServiceImpl();
//1.通过ClassPathXmlApplicationContext加载application.xml获取IOC容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
//2.从IOC容器中根据名字获取对象
bookService = (BookService) context.getBean("bookService");
bookService.save();
BookServiceImpl b = new BookServiceImpl();
}
}
运行结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/7651ee37eca16a86eafb15d3f07902e2.png)