Spring
2021-04-03 15:16:18 2 举报
AI智能生成
spring框架
作者其他创作
大纲/内容
什么是Spring
是一个框架,核心技术是ioc,aop,实现解耦合
是一个容器,容器中存放的是java对象
怎么使用Spring
Spring是一个容器,把项目中用的对象放入到容器中
让容器完成对象的创建,对象之间关系的管理(属性赋值)
我们在程序中从容器中获取要使用的对象
什么样的对象放入容器中
dao类,service类,controller类,工具类
1.使用xml配置文件,使用<bean>
2.注解
Spring中的对象默认都是单例的
不放到Spring容器中的对象
1.实体类对象,实体类数据来自数据库
2.servlet,listener,filter等(这几个对象是由tomcat容器来创建的)
使用Spring框架的步骤
1.加入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
2.创建类:接口、实现类,没有接口的类
3.创建Spring的配置文件,使用<bean>声明对象
4.我们使用容器中的对象,通过ApplicationContext接口和它的实现类ClassPathXmlApplicationContext的方法getBean()
核心技术
iot:控制反转
1.理论,思想,概念:指导开发人员在容器中,代码之外管理对象,给属性赋值,管理依赖
2.ioc技术实现使用的是DI(依赖注入):开发人员在项目中只需要提供对象的名称,对象的创建,查找,赋值都由容器内部资源实现
3.Spring使用的DI的技术,底层使用的是反射机制
4.DI给属性赋值
1.set注入:Spring调用类的set方法实现属性的注入
1.简单类型set注入<property name="属性名" value="属性值">
2.引用类型set注入<property name="属性名" ref="bean的id"/>
2.构造注入:Spring调用有参构造器
1.<constructor-arg/>的name属性,name表示构造器的形参名
2.<constructor-arg/>的index属性,index表示形参在构造器中的位置
3.自动注入
由spring根据某些规则,给引用类型完成赋值,常用的有byName,byType
1.byName:按名称注入,java类中引用类型的属性名和spring容器中bean的id一样,数据类型一样,这样的bean赋值给引用类型
2.byType:按类型注入,java类中引用类型的数据类型和spring容器中bean的class是同源关系的,这样的bean能够赋值给引用类型
5.常用注解
1.@Component:创建对象
2.@Repository,创建dao对象,用来访问数据库的
3.@Service,创建Service对象,处理业务逻辑的,可以有事务功能
4.@Controller,创建控制器对象的,接收请求,显示处理结果的
5.@Value简单类型的属性赋值
6.@Autowired:Spring框架中引用类型的赋值注解,支持byName,byType,默认是byType(如果要用byName的话,需要增加@Qualifier)
7.@Resource:jdk中的注解,使用自动注入给引用类型赋值,支持byName,byType,默认是byName
8.注解的使用步骤
1.加入依赖:spring-context,间接加入spring-aop
2.在类中加入注解
3.在spring的配置文件中,加入组件扫描器的标签<context:component-scan base-package="包名"/>
6.ioc能实现解耦合
ioc能实现业务对象之间的解耦合,例如service和dao对象之间的解耦合。
aop:面向切面编程
底层是动态代理
1.jdk动态代理
使用jdk反射包中的类实现创建代理对象的功能
要求:目标类必须实现接口
2.cglib动态代理
使用第三方的工具库,实现代理对象的创建
要求:目标类必须能够继承,不能是final
原理:就是继承,子类就是代理
aop:看作是动态代理的规范化,把实现动态代理的步骤进行了一个规范,定义
aop作用
1.在目标类不修改源代码的情况下,增加功能
2.减少重复代码
3.专注业务功能的实现
4.解耦合:业务功能和日志、事务这些非业务功能的耦合
什么时候考虑使用aop技术
1.当你要给一个系统中存在的类修改功能,但是原有类的功能不完善,但是你还有源代码,使用aop就可以增加功能
2.你要给项目中的多个类,增加一个相同的功能,使用aop
3.给业务方法增加事务,日志输出
aop的实现框架
1.spring实现了aop,实现方式是接口
2.aspectJ框架
1.使用注解可以实现aop的功能
2.使用xml配置文件中的标签实现aop功能
aop中的概念
1.aspect:切面,表示给业务方法增加的功能,一般日志输出,事务,权限检查等是切面
2.pointcut:切入点,是一个或多个JoinPoint的集合,表示切面功能执行的位置
3.advice:通知,也叫增强,表示切面执行的时间,在方法前,方法后等等
aspectJ框架的使用
1.表示切面的执行时间,使用的通知注解
1.@Before:前置通知,在目标方法之前执行切面的功能
2.@AfterReturning后置通知,在目标方法之后执行的,能够获取到目标方法的返回值
3.@Around环绕通知,在目标方法前和后都能增强功能,控制目标方法的访问,修改返回值
4.AfterThrowing异常通知,在目标方法抛出异常后执行的通知
5.@After最终通知,总是会被执行的代码
6.@Pointcout 定义和管理切入点的辅助注解
7.代理的使用方式
1.如果目标类有接口,框架默认使用jdk动态代理
2.如果目标类没有接口,框架默认使用cglib动态代理
3.有接口也可以强制使用cglib动态代理
2.表示切面位置的切入点表达式:execution(访问修饰符 返回值 包名.类名.方法名称(方法的参数) 异常)
spring整合mybatis
整合的思路:使用spring的ioc核心技术,把mybatis框架中使用的对象交给spring统一创建和管理。
spring是容器,存放项目中要使用的各种对象,例如Service对象,Dao对象,工具类对象等等
spring是容器,存放项目中要使用的各种对象,例如Service对象,Dao对象,工具类对象等等
交给spring的mybatis对象
1.数据源DataSource,使用阿里的Druid连接池
2.SqlSessionFactory对象,使用的SqlSessionFactoryBean在内部创建的SqlSessionFactory
3.Dao代理对象,使用的MapperScannerConfigurer,在这个类的内部,调用getMapper(),创建接口的Dao对象
spring事务
什么是事务
讲mysql的时候,提出了事务。 事务是指一组sql语句的集合, 集合中有多条sql语句
可能是insert , update ,select ,delete, 我们希望这些多个sql语句都能成功,
或者都失败, 这些sql语句的执行是一致的,作为一个整体执行。
可能是insert , update ,select ,delete, 我们希望这些多个sql语句都能成功,
或者都失败, 这些sql语句的执行是一致的,作为一个整体执行。
多种数据库访问技术处理事务的不足
1.不同的数据库访问技术,处理事务的对象,方法不同,
需要了解不同数据库访问技术使用事务的原理
需要了解不同数据库访问技术使用事务的原理
2.开发人员需要掌握多种数据库中事务的处理逻辑。什么时候提交事务,什么时候回滚事务
3.处理事务有多种方法
spring声明式事务
提供了一种处理事务的统一模型, 能使用统一步骤,方式完成多种不同数据库访问技术的事务处理。
统一处理步骤:
1.使用的事务管理器对象,代替你完成commit,rollback。指定要使用的事务管理器实现类
<bean id=“xxx" class="...DataSourceTransactionManager">
<bean id=“xxx" class="...DataSourceTransactionManager">
2.指定哪些类,哪些方法需要加入事务的功能
3.指定方法需要的事务类型
1.事务的隔离级别
2.事务的超时时间
3.事务的传播行为
具体的事务处理方式
适合中小型项目的方案(注解方案)
1.添加依赖 spring-tx
2.声明事务管理器对象 <bean id="transactionManager" class="DataSourceTransactionManager">
3.开启事务注解驱动 :<tx:annotation-driven transaction-manager="transactionManager"/>
(告诉spring框架,我要使用注解的方式管理事务)
(告诉spring框架,我要使用注解的方式管理事务)
4.在方法的上面加入@Transactional
适合大型项目的方案(都是在xml配置文件中实现)
1.添加依赖 spring-aspects
2.声明事务管理器对象 <bean id="transactionManager" class="DataSourceTransactionManager">
3.声明方法需要的事务类型(配置方法的事务属性【隔离级别,传播行为,超时】)
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name=""/>
</tx:attributes>
</tx:advice>
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name=""/>
</tx:attributes>
</tx:advice>
4.配置aop:指定哪些类要创建代理。
<aop:config>
<aop:pointcut id="servicePt" expression="execution(* *..service..*.*(..))"/>
<!--关联advice和pointcut-->
<aop:advisor advice-ref="myAdvice" pointcut-ref="servicePt"/>
</aop:config>
<aop:config>
<aop:pointcut id="servicePt" expression="execution(* *..service..*.*(..))"/>
<!--关联advice和pointcut-->
<aop:advisor advice-ref="myAdvice" pointcut-ref="servicePt"/>
</aop:config>
0 条评论
下一页