1、相关概念
1.1、Spring来源
官网:Spring | Home
Spring是一个分层的Java SE/EE应用一站式的轻量级开源框架。Spring核心是IOC
和AOP
。
Spring主要优点包括:
2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。
2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。
Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器(框架)。
1.2、Spring系统架构
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式 .
DI:依赖注入,一个BookService类的功能需要依赖另外一个BookDao类配合,同时需要附上一个具体的对象,则成这种关系是依赖注入;IOC:控制反转,以前依赖的对象自己直接new,现在不需要new,框架会自动注入对象,创建对象的权利转移给了框架;
Spring框架负责所有对象的创建、管理和依赖注入;所有的对象存储的容器叫做IOC容器;
dao包
1.接口BookDao
public interface BookDao {
public void insert();
}
2.实现类BookDaoImpl
public class BookDaoImpl implements BookDao {
@Override
public void insert() {
System.out.println("BookDaoImpl......insert");
}
}
service包
1.接口BookService
public interface BookService {
void save();
}
2.实现类BookServiceImpl
public class BookServiceImpl implements BookService {
private String name;
private BookDao bookDao;
public void setName(String name) {
this.name = name;
}
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void save() {
System.out.println("BookServiceImpl......save+name");
bookDao.insert();
}
}
BookServiceImpl需要给bookDao属性设置setter方法,框架才能自动注入
servlet包
在servlet中进行测试
1.首先获取IOC的容器;
2.从容器中获取bookService对象;
3.执行方法:servlet执行---service执行,由于spring完成了依赖注入------dao包执行
public class BookServlet {
BookService bookService;
@Test
public void add() {
System.out.println("BookServlet...add");
//1.获得IOC容器
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
//2.根据名字从容器中获取对象
bookService= (BookService) context.getBean("bookService");
bookService.save();
}
}
3.2、创建spring的核心配置文件
bean标签:把对应class的对象创建到IOC容器中,如果当前对象有依赖的其他对象,那么可以通过property对依赖的对象使用ref引用容器中已经注册过的对象。
把所有对象创建到spring的IOC容器中,并起上名字;id:表示给对象起名字 class:类的全类名spring的依赖注入:property表示BookServiceImpl的属性,常规属性使用value赋值,类型属性使用ref引用
控制台日志信息
4.bean作用范围scope配置
singleton:单列,框架会唯一创建该对象,后续获取的都是同一个,在配置文件加载的时候创建了
prototype:非单例/多例,框架在每次获取的时候创建一个新的,在获得的时候创建。多线程
单例
多例
5.静态工厂实例化
factory:工厂对象;工厂类就是制造对象的,一般没有功能;
class:工厂类的全类名
factory-method:具体工厂类中创建对象的方法名
配置
测试
public class Test02 {
@Test
public void test02(){
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
BookServiceFactory factory = (BookServiceFactory) context.getBean("bookService3");
System.out.println(factory);
}
}
日志信息
配置工厂
静态工厂创建对象
public class BookServiceFactory {
public static BookService getBean(){
return new BookServiceImpl();
}
}
测试类
public class Test02 {
@Test
public void test02(){
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
BookService factory = (BookService) context.getBean("bookService3");
System.out.println(factory);
}
}
日志信息
6.setter注入
配置中使用property标签的ref属性注入引用类型对象
对于基本数据类型(包括String),指定属性值使用"value"属性,而对于引用类型使用"ref"属性。
在BookServiceImpl中定义引用类型属性,提供可访问的setter方法
public class BookServiceImpl implements BookService {
BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
7.构造器注入
使用constructor-arg标签进行依赖注入,name属性要与实现类中提供的形参类型和个数一致,否则将会报错。
在BookServiceImpl中定义引用类型属性,提供有参的构造方法
public class BookServiceImpl implements BookService {
String name;
BookDao bookDao;
public BookServiceImpl(String name, BookDao bookDao) {
System.out.println("有参");
this.name = name;
this.bookDao = bookDao;
}
}
8.集合注入
使用相应标签(list、set、array、map...)对属性值进行注入
张三
张四
张五
南阳
信阳
濮阳
安阳
开封
郑州
在BookServiceVipl中定义引用类型属性,提供可访问的setter方法
public class BookServiceVip implements BookService {
List list;
Set set;
Map map;
public void setList(List list) {
this.list = list;
}
public void setSet(Set set) {
this.set = set;
}
public void setMap(Map map) {
this.map = map;
}
@Override
public String toString() {
return "BookServiceVip{" +
"list=" + list +
", set=" + set +
", map=" + map +
'}';
}
}
9.注解
1.创建项目导入jar包
2.创建接口和实体类
配置文件
自动注入
优先按照类型注入,如果有多个对象,按照名字进行注入
@Override注解告诉你下面这个方法是从父类/接口继承过来的,需要你重写一次,这样就可以方便你阅读,也不怕会忘记。是伪代码,表示重写(当然不写也可以);
@Componet:自动扫描
@Autowired:自动注入属性
@Qualifier:指定名字进行注入
BookDaoImpl类使用注解 @Componet
@Component("bookDao")
public class BookDaoImpl implements BookDao {
@Override
public void insert() {
System.out.println("BookDaoImpl......insert");
}
}
BookServiceImpl类使用注解 @Componet ;@Autowired
@Component("bookService")
public class BookServiceImpl implements BookService {
//自动注入优先按照类型注入,如果有多个对象,按照名字进行注入
@Autowired
BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void save() {
System.out.println("BookServiceImpl......save");
bookDao.insert();
}
}
测试类
public class Test01 {
BookService bookService;
@Test
public void test01(){
ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("spring.xml");
//按照类型获得对象,前提类型有唯一的对象
bookService = context.getBean(BookService.class);
this.bookService.save();
}
}
打印日志