一、Spring是一个开源框架(框架针:对项目的整体或者某一个部分提供了一个完整的实现方案)
1、Spring的七大核心体系
2、框架的优点
(1)属于轻量级框架;从大小与开销两方面而言Spring都是轻量的
(2)非入侵;依赖性小
(3)大量使用注解,支持:约定优于配置
(4) 除了框架自己的产品以外,还支持兼容其他框架
(5)它没有任何的强制要求,不需要遵从任何的编程规范
(6)它是免费开源的,可以扩展
二、IOC容器
1、BeanFactory:通过反射+工厂模式完成对业务组件的管理;实质:Spring容器(装组件的地方)
BeanFactory是Spring的接口,有自己的实现类。在用户调用getBean("参数名")才会产生对象
2、ApplicationContext是BeanFactory的子接口
优点:
(1)继承了BeanFactory的所有方法
(2)拓展了Events、Resources、i18n、Validation、Data Binding、Type Conversion、SpEL
(3)实例化组件的实机,项目一启动就会实例化所有的组件
(4)支持Web项目的集成
提供:IOC Container、Events、Resources、i18n、Validation、Data Binding、Type Conversion、SpEL
三、Spring环境搭建
1、创建Maven项目
2、导入Spring框架的依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
3、简单使用
3.1 创建配置文件(xxx.xml)
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 向Spring的容器中,注册某一个组件 id 和class 是必填内容 -->
<bean id="userBean" class="com.woniuxy.springstudy.entity.UserBean"></bean>
</beans>
3.2 从容器中获取实例(xxxTest.java)
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationContextTest {
/**
* Spring容器
* BeanFactory factory
*/
private ApplicationContext ac;
@Before
public void before(){
//创建容器
ac = new ClassPathXmlApplicationContext("classpath:beans.xml");
}
@Test
public void testUserBean(){
UserBean userBean = (UserBean) ac.getBean("userBean");
System.out.println(userBean);
}
}
4、bean
4.1 bean:是Spring容器管理组件的最小单位,可大(项目)可小(类)
4.2 管理方式(xxx.xml)
<!-- 向Spring的容器中,注册某一个组件 id 和class 是必填内容 -->
<bean id="userBean" class="com.woniuxy.springstudy.entity.UserBean"></bean>
4.3 作用范围
singleton:单实例,默认每一个容器组件都有一个唯一的实例
prototype:原型模式【克隆】,以最初的实例为原型,创建新的对象,应用程序自己负责实例的销毁
request:请求:跟HttpServletRequest对象有关,在一个请求范围的内容,Spring对组件有一个唯一的实例
session:会话:跟HttpSession对象有关,在一个会话范围内的内容,Spring容器对组件只有一个实例
application:应用上下文,跟ServletContext有关,在ServletContext范围内,Spring容器对组件只有一个实例
Websocket:socket通信。可以在服务器端直接给前端发送消息,在每次通信范围内,Spring容器对组件只有一个实例
四、依赖注入(DI:dependency Injection)
目录
一、Spring是一个开源框架(框架针:对项目的整体或者某一个部分提供了一个完整的实现方案)
四、依赖注入(DI:dependency Injection)
依赖注入:以前是组件之间直接相互依赖,现在组件依赖容器,由容器创建组件的实例,以及维护实例之间的关系。容器创建好实例以及关系之后,再由容器将实例注入到程序的过程
所以:IOC和DI都是对Spring容器的一种描述,只不过:说法的方向不一样的
IOC:是从创建对象的控制权出发
DI:从对象的依赖关系的出现
4.1 setter注入
step1:
public class UserServiceImpl implements IUserService {
private IUserDao userDao;
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
}
step2:关系配置
<!-- 向Spring的容器中,注册某一个组件 id 和class 是必填内容 -->
<bean id="userServiceImpl" class="com.woniuxy.springstudy.usermag.service.impl.UserServiceImpl">
<property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="com.woniuxy.springstudy.usermag.dao.impl.UserDaoImpl"></bean>
4.2 构造器注入
step1:
public class UserServiceImpl implements IUserService {
private IUserDao userDao;
public UserServiceImpl(IUserDao userDao) {
this.userDao = userDao;
}
}
step2:
<!-- 向Spring的容器中,注册某一个组件 id 和class 是必填内容 -->
<bean id="userServiceImpl" class="com.woniuxy.springstudy.usermag.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDaoImpl"></constructor-arg>
</bean>
<bean id="userDaoImpl" class="com.woniuxy.springstudy.usermag.dao.impl.UserDaoImpl"></bean>
4.3 自动装配
装配规则:
byType:按照属性的类型来进行装配,必须提供setter()
byName:按照属性的名称来进行装配,必须提供setter()
constructor:按照构造器来进行装配,必须提供构造方法
default: 不使用自动装配
byName:Spring在装配组件时,会自动检查组件身上的所有的属性,并获得属性的名称,回到Spring容器问有没有跟这个名称一模一样的组件存在 ?如果没有,装配时不会抛出任意异常,但是在运行时,会抛出NullPointerException 属于精准装配
byType:Spring在装配组件时,会自动检查组件身上的所有的属性,并获得属性的类型,回到Spring容器问有没有跟这个类型有关的组件实例存在?如果没有,装配时不会抛出任意异常,但是在运行时,会抛出NullPointerException;如果有,但是超过1个以上,那么在装配时将会抛出UnsatisfiedDependencyException;如果有,并且只有1个,则装配成功
constructor:Spring在装配组件时,会自动检查组件身上所有的构造器,并获得构造器的参数类型,使用byType的方法完成对参数进行装配值
代码:
<beans default-autowire="constructor"></beans>
五、Spring容器注解
常见的注解:@Controller @Service @Repository @Component
@Component:表示一个需要被Spring容器管理起来的普通Java类
@Repository:表示一个需要被Spring容器管理起来的持久层类
@Service:表示一个需要被Spring容器管理起来的业务层类
@Controller:表示一个需要被Spring容器管理起来的控制层类
5.1 组件注解的用法
step1:
/**
* 默认情况下:会使用UserServiceImpl类名的首字母小写,
* 作为该组件在Spring容器中的名字
* @Service(value="us") 自定义名字
*/
@Service
public class UserServiceImpl implements IUserService {
private IUserDao userDao;
}
@Repository
public class UserDaoImpl implements IUserDao {
}
step2:在xxx.xml文件中开启自动扫描
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--开启Spring容器的自动扫描功能-->
<context:component-scan base-package="com.woniuxy.springstudy"></context:component-scan>
</beans>
5.2 关系注解的用法
5.2.1 @Autowired 先使用byType的方式进行装配,当发现数量>1时,会进行byName进行精准装配,Spring提供模糊装配模式
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;
}
5.2.2 @Resource 先使用byName的方式进行装配,找不到时会进行byType进行装配JDK提供的精准装配模式
@Service
public class UserServiceImpl implements IUserService {
//非常精准的指定:需要装配的组件
//一旦写了name,那么就不会再ByType
@Resource(name="userDaoImpl")
private IUserDao userDao;
}
5.2.3 查看容器中组件的名称
@Before
public void before(){
//创建容器
ac = new ClassPathXmlApplicationContext("classpath:beans.xml");
//查看所有组件的名称
String[] beans = ac.getBeanDefinitionNames();
System.out.println(Arrays.toString(beans));
}
5.3 拓展注解
5.3.1 @PostConstruct 该注解的作用:实例化组件时,做初始化任务
@Service
public class UserServiceImpl implements IUserService {
@PostConstruct
public void init(){
System.out.println("初始化的任务");
}
}
5.3.2 @PreDestroy 销毁组件实例时,做收尾工作
@Service
public class UserServiceImpl implements IUserService {
@PreDestroy
public void destory(){
System.out.println("收尾的任务");
}
}
5.3.3 自定义配置类(替代xxx.xml文件)
step1:
@Configuration
@ComponentScan(basePackages = {"com.woniuxy.springstudy"})
public class ApplicationContextConfigure {
}
step2:
@Before
public void before(){
ac = new AnnotationConfigApplicationContext(ApplicationContextConfigure.class);
//查看所有组件的名称
String[] beans = ac.getBeanDefinitionNames();
System.out.println(Arrays.toString(beans));
}