spring5笔记1
spring是轻量级的开源框架
spring有两部分核心:
1). IOC: 控制反转,把**创建对象**和**对象之间的调用**交给spring进行管理
2). Aop: 面向切面,不修改源代码的基础上进行功能增强
Spring 特点:
(1)方便解耦,简化开发
(2)Aop 编程支持
(3)方便程序测试
(4)方便和其他框架进行整合
(5)方便进行事务操作
(6)降低 API 开发难度
IOC
IOC:控制反转,把对象创建和对象之间的调用过程交给spring进行管理
目的:降低耦合度
IOC的底层原理:
eg: 实现在一个类里调用另一个类的方法
1). 原始方法:在一个类里通过new方式创建另一个类,可以实现,但耦合度太高
class UserDao{
add(){
...
}
}
class UserService{
excute(){
//通过new对象的方式创建对象,再调用其方法
UserDao userDao = new UserDao();
userDao.add();
}
}
2). 工厂模式:另创建一个类UserFactory,再此类中创建对象,实现了一定程度的解耦
class UserFactory{
public static UserDao getDao(){
return new UserDao();
}
}
class UserService{
excute(){
//通过调用工厂类中的方法创建对象,再调用其方法
UserDao userDao = UserFactory.getDao();
userDao.add();
}
}
3). IOC:进一步降低耦合度
xml解析 + 工厂模式 + 反射
xml解析:是指对xml文件进行解析获取值,常见方式:Dom4j
反射:通过得到类的字节码文件,可以操作类中所有内容
<!--1.通过xml配置文件,配置创建的对象-->
<bean id="dao" class="com.atguigu.UserDao"></bean>
//2.有service类和dao类,再创建工厂类
class UserFactory{
public static UserDao getDao(){
//2.1 xml解析:获取全路径(包名+类名)
String classValue = class属性值;
//2.2 通过反射创建对象:获取class类的对象
Class clazz = CLass.forName(classValue);
return (UserDao)clazz.newInstance();
}
}
注意:class.newInstance() 只能调用无参构造器
一般:耗时耗资源的交给服务器启动时完成
IOC接口:
IOC思想基于IOC容器完成,IOC容器底层就是工厂对象
Spring提供IOC容器实现的两种方式:(两个接口)
1)BeanFactory:IOC容器的基本实现,是spring内部使用的接口,不提供给开发人员使用
* 在加载配置文件时不会创建对象,在使用对象时才去创建对象
public class TestDemo1 {
@Test
public void test01(){
//1.加载spring配置文件(此时不会创建对象)
BeanFactory app = new ClassPathXmlApplicationContext("bean1.xml");
//2.获取配置文件创建的对象
User user = app.getBean("user", User.class);
System.out.println(user);
user.add();
}
}
2) ApplicationContext:BeanFactory接口的子接口,提供更强大的功能,一般由开发人员使用
* 在加载配置文件时就会创建对象
public class TestDemo1 {
@Test
public void test01(){
//1.加载spring配置文件(创建对象)
ApplicationContext app = new ClassPathXmlApplicationContext("bean1.xml");
//2.获取配置文件创建的对象
User user = app.getBean("user", User.class);
System.out.println(user);
user.add();
}
}
两个实现类:
FileSystemXmlApplicationContext: 加载的是绝对路径(比如从c盘开始)
ClassPathXmlApplicationContext:加载的是相对于src文件下的路径