三大框架Spring
1.1、Spring是什么
Spring是分层的 Java SE/EE应⽤full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制) 和 AOP(Aspect Oriented Programming:⾯向切⾯编程)为内核。
(IOC:作用:原先对象的创建和管理由开发人员手动,有了IOC后对象的创建和管理交给了spring容器)
1.2、Spring的优势
1.方便解耦,简化开发
2.AOP编码的支持
3.声明式事务的支持
4.方便程序的测试
⼆、Spring快速入门
2.1、Spring程序开发步骤
- 新建工程导入相关Jar包;
- 编写接口和实现类;
- 编写Spring核心配置文件;
- 编写测试类进行测试。
2.2、导入相关Jar包
2.3、编写接口和实现类
2.4、编写Spring核心配置文件
applicationContext.xml
2.5、编写测试类进行测试
public class MyTest {
@Test
public void test() {
//加载配置文件,创建应用上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取对象
UserDao userDao = (UserDao) context.getBean("userDao");
userDao.save();
}
}
三、Spring配置⽂件
3.1、Bean标签基本配置
bean标签的基本配置
作用:通过配置将对象的创建交给spring容器进行管理
默认调用无参构造函数,如果没有无参构造函数则不能创建成功
id:bean实例在spring容器的唯一标识(就是调用时的名字)
class:bean的全限定名称(就是所代表的实现类impl)
例子:
<!--
配置Bean,让UserDaoImpl对象的创建交给Spring容器管理
class:指定要创建的对象的全类名
id:该对象的编号(唯一标识)
scope:对象的作用范围:
singleton:创建单例对象
(所有new出来的userdao的地址都指向同一个对象)
prototype:多例对象
-->
<bean id="userdao" class="com.hpe.dao.impl.UserDaoImpl"
scope="singleton"/>
3.2、Bean标签范围配置
scope:指对象的作用范围,取值如下:
- 当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
Bean的生命周期:
- 对象创建:当应用加载,创建容器时,对象就被创建了;
- 对象运行:只要容器在,对象一直活着;
- 对象销毁:当应用卸载,销毁容器时,对象就被销毁了。
- 当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()法时实例化Bean
Bean的生命周期:
- 对象创建:当使用对象时,创建新的对象实例;
- 对象运行:只要对象在使用中,就一直活着;
- 对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了。
3.3、Bean生命周期配置
init-method:指定类中的初始化方法名称
destroy-method:指定类中销毁方法名称
3.4、Bean实例化三种⽅式
3.4.1、使⽤无参构造方法实例化
根据默认⽆参构造⽅法来创建类对象,如果bean中没有默认⽆参构造函数,将会创建失败
<bean id="userDao" class="com.hpe.dao.impl.UserDaoImpl">
3.4.2、工厂静态方法实例化
创建静态⼯⼚
3.4.3、工厂实例方法实例化
3.5、什么是依赖注⼊
依赖注⼊:Dependency Injection ,指容器负责创建和维护对象之间的依赖关系,而不是通过对象本⾝ 负责自己的创建和解决自己的依赖。在当前类需要⽤到其他类的对象,由Spring为我们提供,我们只需 要在配置中说明。 业务层和持久层的依赖关系,在使⽤ Spring 之后,就让 Spring 来维护了。 简单的说,就是坐等框架把持久层对象传⼊业务层,而不用我们自己去获取。 3.6、依赖注入方式
3.6.1、构造方法注入
- 创建接口UserService和实现类UserServiceImpl
public interface UserService {
void save();
}
public class UserServiceImpl implements UserService {
//这里一定要有该属性,我们最终的目的是让该属性关联一个UserDaoImpl的对象
private UserDao userDao;
public UserServiceImpl() {
}
//一定要有该有参的构造方法,通过该方法完成依赖注入
public UserServiceImpl(UserDao userDao) {
this