Spring
下载地址
优点
- 开源的免费框架/容器
- 轻量级、非入侵式的框架
- 控制反转IOC 面向切面编程AOP
- 支持事务的处理,对框架整合的支持
组件
拓展
IOC
IOC理论推导
- 背景
在之前业务中,用户需求(new对象)可能会影响原来的代码,我们需要根据用户的需求去修改源代码。
问题的解决方案
使用一个set接口实现,把控制权交到程序员手上(程序不再具有主动性:创建对象,而是变成了被动的接受对象)
IOC的原型:程序员不用再去管理对象的创建,大大降低系统的耦合性,从而能够更专注于业务实现private UserDao userDao;
//利用set进行动态实现值的注入
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public void getUser() {
userDao.getUser();
}
IOC的实质
- 控制反转IOC,是一种设计思想,依赖注入DI是实现IOC的一种方法。没有IOC程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方。
- 采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体:Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
- 控制反转:一种通过描述(XML / 注解)并通过第三方去生产或获取特定对象的方式。在spring中实现控制反转的是IOC容器,其实现方法是DI
HelloSpring
- pojo层的Hello实体
- beans.xml
- Mytest
思考问题
Hello对象是谁创建的?
hello对象是由Spring创建的Hello对象的属性是怎么设置的?
hello对象的属性是由Spring容器(即:beans)设置的
总结
反转:程序本身不创建对象,而是变成被动的接受对象
依赖注入:利用set方法来进行注入的直到现在,我们彻底不用在小程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改。所谓的IOC,一句话搞定:对象由spring来创建、管理、装配。
IOC创建对象方式
无参构造
三种有参构造
- 第三种!参数名
- 总结
在配置文件加载时,容器中管理的对象就已经初始化了。
Spring的配置
别名
<!-- 别名,如果添加了别名,我们也可以使用别名来获取这个对象-->
<alias name="user" alias="userNew"/>
Bean
<!--
id: bean的唯一标识符,也就是相当于 对象名
class: bean对象所对应的全限定名:包名 + 类型
name:别名,更高级,能同时起多个别名
-->
<bean id="userT" class="com.kuang.pojo.UserT" name="user2,u2">
<property name="name" value="c110"/>
</bean>
import
- applicationContext.xml
依赖注入
构造器注入
Set方式注入!
依赖注入:set注入
- 依赖
- 注入
环境搭建
- 复杂类型
- 真实测试对象
beans.xml
普通注入:value
Bean注入:ref
数组注入
List注入
Map注入
- 测试类
拓展方式注入
c命名 p命名 空间注入
p命名空间的注入:可以直接注入属性的值:property
- 依赖第三方的约束
- 依赖第三方的约束
c命名空间的注入:通过构造器注入:constructor-args
- 依赖第三方约束
Bean
Bean的作用域
单例singleton:spring默认
原型模式prototype:每次从容器中get时,都会产生一个新对象
其余的request session application 只能在web开发中使用到
自动装配Bean
自动装配:Spring满足bean依赖的一种方式(Spring会在上下文中自动查找,并给bean装配属性)
三种装配方式
注解实现自动装配
常用依赖
开启约束
-
@Autowired (required = false)
如果显示定义了Autowired的required属性为false,说明这个对象可以为null,否则不允许为空@Autowired
@Qualifier(value=”dog222”):如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候,我们可以使用@Qualifier(value=”xxx”)去配置@Autowired的使用,指定一个唯一的bean对象注入
@Resource
先名字查找,再按类型查找- @Resource(name=”cat2”)
小结
- @Resource 和 @Autowired 的区别
Spring注解开发
在spring4之后,要使用注解开发,必须保证aop的包导入了。使用注解需要导入 context约束,增加注解的支持。
@Component 组件:等价于
- 放在类上,说明这个类被Spring管理了,就是bean!
@Value(“kuangshen”):属性注入
- 相当于
@Component 的三个衍生注解 —— 在web开发中,会按照MVC三层架构分层( 将某个类注册到Spring,装配Bean)
- dao:@Repository
- service:@Service
- controller:@Controller
bean
属性如何注入
衍生的注解
自动装配置
作用域
小结
使用JavaConfig实现配置
完全不使用Spring的xml配置,全权交给Java来做
JavaConfig是Spring的一个子项目User: 要加载到Spring里的类
- @Component:说明这个类被Spring托管了,注册到容器中。
- @Value(“QINJIANG”) 属性被注入值
KuangConfig
@Configuration :这个也会被SP让那个容器托管,注册到容器中。(因为他本来就是一个@Component)
代表一个配置类,跟之前看的beans.xml一样
- @ComponentScan(“com.kuang.pojo”)
@Bean:相当于之前写的一个bean标签
- 这个方法的名字,就相当于bean标签中的id属性
- 这个方法的返回值,就相当于bean标签中的class属性
测试类MyTest
有两个bean.xml的情况该怎么操作
@Import(KuangConfig.class):@Import除了可以把普通的类定义为Bean,@Import还可以引入一个@Configuration修饰的类(引入配置类),从而把让配置类生效(配置类下的所有Bean添加到IOC容器里面去)。在自定义starter的时候经常会用到。
代理模式
代理模式 是 SpringAOP的底层
代理模式的分类
静态代理
角色分析
抽象角色:一般会使用接口 或 抽象类 来解决
真实角色:被代理的角色
代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作
- 附属操作:中介存在的意义
- 附属操作:中介存在的意义
客户:访问代理对象的人
代理前
代理后
静态代理再理解:不改变原来的代码的前提下,修改代码
动态代理
角色:动态代理和静态代理一样
- 不同:动态代理的代理类是动态生成的,不是我们直接写好
分类
基于接口的动态代理
- JDK动态代理
基于类的动态代理
- cglib
- javassist:Java字节码实现
- 代理模式的好处 / 缺点
AOP
什么是AOP
AOP在Spring中的作用
提供声明式服务,允许用户自定义切面
横切关注点:与业务逻辑无关,但我们需要关注的部分:日志、安全、缓存、事务等
切面ASPECT:一个类Log —— 横切关注点 被模块化 的特殊对象
通知Advice:类Log中的一个方法 —— 切面要完成的工作
- Spring支持5中类型的Advice
目标Target:一个接口/方法 —— 被通知的对象
代理Proxy:想目标对象应用通知之后创建的对象
切入点PointCut:切面通知执行的“地点“的定义 如:method.invoke()
连接点JointPoint:与切入点匹配的执行点
使用Spring实现AOP
导入依赖
UserService
UserServiceImpl
方式一:使用原生Spring API接口
Log
AfterLog
把类注册到Spring中:Spring API
applicationContext.xml
- 加上约束
****
:public 返回值 类名 方法名 参数
- MyTest
方式二:自定义来实现AOP(主要是切面定义)
- 优点
切入点可以复用、可以有多个不同的切入点
DiyPointCut
applicationContext.xml
方式三:注解实现AOP
@Before(“execution()”)
applicationContext.xml
- 也可以直接 在AnnotationPointCut 类上 @Component
- 也可以直接 在AnnotationPointCut 类上 @Component
整合Mybatis
导入依赖
- Junit
- mysql数据库
- mybatis
- spring相关的
- aop织入
- mybatis-spring
配置文件
测试
mybatis-config.xml
UserMapper.xml
-
Mytest
pom
整合mybatis方式一
导入依赖
DataSource SQLSessionFactory
- 后来是放在applicationContext.xml中,这样这里就单纯操作数据库
UserMapperImpl
applicationContext.xml
Mytest
总结:
整合mybatis方式二
- 直接继承SqlSessionDaoSupport
User实体类
UserMapper接口:取数据
UserMapper.xml
spring-dao.xml:配置mybatis
UserMapperImpl.xml
直接继承SqlSessionDaoSupportapplicationContext.xml:把实现类注入Spring容器
MyTest
Spring声明事务
- 引子
一个使用Mybatis-Spring的原因:它允许mybatis参与到spring的事务管理中,而不是给mybatis创建一个新的专用事务管理器,mybatis-spring借助了spring中的DataSourceTransactionManager来实现事务管理。
标准配置
开启Spring的事务处理功能:在Spring的配置文件中创建一个 DataSourceTransactionManager对象。
交由容器管理事务——结合AOP实现事务的织入
执行增删改查的时候自动丢事务