Spring知识点
IOC相关
ioc注解模式需要在配置文件中增加
<context:component-scan base-packege="包名"> <context:component>
1.如果spring容器中两个组件有调用关系,使用如下注解:
@Resource
2.默认按照类型匹配,如果容日中有多个符合要求的bean对象,优先使用属性名相同的bean对象,也可以通过@Resource(name="需要注入的bean的1id")指定
@Autowired默认按照类型匹配,如果需要指定bean的名称,可以通过@Qualifier("需要注入的bean的id值")来指定
properties常量数据注入
1.在spring配置文件中加载properties文件数据
<util:properties id="constant" location="classpath:constant,properties"></util:perproties>
2.在javaBean组件中使用spring表达式来获取
@Value("#{constant.name}")
private int name
AOP相关注解
开启aop注解,一对多的调用关系
1.在spring配置文件中启用aop注解
<aop:aspect-autoproxy> </aop:aspect-autoproxy>
2.在javaBean中使用以下注解
@Component --将组件纳入容器
@Aspect --定义方面
@Pointcut("within(包名)") --切入点,定义在某个方法,变量,或者类上面
@Around,@Before,@AfterReturing,@After, @AfterThrowing,在具体方法上面定义通知类型
spring与mybatis整合
1.引入依赖
- a.spring-context
- b.spring-aspects
- c.mybatis
- d.mybatis-spring
- e.spring-jdbc
- f.durid
- g.mysql-connertor
2.引入spring主配置文件
// spring加载mybatis,在配置文件中配置mybatis
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
// mapper配置文件
<!--peoperty name="mapperLocations" value="testMapper.xml"/--> // 单个写法
<property name="MapperLocations"> // 多个写法
<list>
<value>
xxx.xml
</value>
<value>
yyy.xml
</value>
</lisr>
</property>
<!--property name="mapperLocations" value="mapper/*.xml"></property-> //批量写法
<peoperty name="typeAliasesPackage" value="包名"/> // 定义别名
</bean>
// 加载数据库配置文件
<util:properties id="db" location="classPath:db.properties"/>
<!--配置连接池/>
<bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=utf8">
<property name="driverClassName" value="com.mysql.jdbc.Driver">
<property name="username" value="db.name">
<property name="password" value="1111">
<property name="initialSize" value="2"> // 初始化大小
<property name="minIdle" value="2"> // 至少空闲数
<property name="maxActive" value="10"> // 最大连接数
<property name="maxWait" value="3000"> // 超时时间,单位毫秒
</bean>
// 注册接口所对应的实现类(dao),代替sqlsession.getmapper
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="xx.xx.dao"/> //扫描并注册下面的dao接口
<property name="annotationClass" value="Annotation包"> // 表示加了指定注解的dto才会被自动加载
</bean>
spring事务
- 事务
事务是包含一系列动作组成的完整的工作单元。一系列动作要么都成功,要么一个都失败,假如中间有失败的动作,所有的东西都要回滚到初始状态- 事务的四个特性
1.原子性 --一个事务是一个整体
2.一致性 --数据变化前后总量不变
3.隔离性
4.持久性 --数据变化后进行入库存储- 事务的隔离级别
read-uncommitted ->读未提交->B事务可以看到A事务未提交的数据(会读到脏数据)
read-committed ->读提交->B事务可以读A事务提交的数据->(不可重复度)(存疑待详细了解)
repeatable-read ->可重复度->B事务读不到A事务提交的数据->(幻读)(存疑待详细了解)–>A事务删除一条记录,B事务在A事务删除之前做一次查询,B事务在A事务删除之后依然能查到该条数据但无法删除,犹如幻觉
serializable 序列化- spring事务
1.spring提供了事务的支持,其本质是对数据库事务的封装。数据库若不支持事务,则spring也无法提供事务的功能。
2.spring提供了统一管理事务的组件,platformTransactionManager,具体事务管理机制由各个平台自己实现。如果是Hibernate的orm框架,提供的事务管理组件是HibernateTransactionManager;JDBC/mybatis,提供的事务管理组件是DataSourceTransactionManager- 事务定义TransactionDefinition
该组件定义了spring组件管理事务的策略。
1.事务传播
2.事务隔离–与数据库支持的隔离级别一直,默认是mysql数据库的隔离级别(可重复度)。
3.事务超时–特定时间内事务没有执行完毕事务就会自动回滚,默认时间与mysql的超时时间保持一致。
4.是否只读–设置是否是只读事务,如果事务只对数据库进行查询操作就可以设置为只读事务,来减少事务的消耗
5.事务回滚–默认情况下事务只有遇到运行时间异常时才会回滚。而在遇到检查性异常时不会回滚。可以通过配置设置哪些运行期间异常不回滚,也可以设置哪一些检查性异常需要回滚- spring中的7种事务传播行为
1.REQUIRED(常用)–如果当前没有事务,就新建一个事务,有过已经存在一个事务,就加入到这个事务。
2.SuPPORTS:支持当前事务。如果当前没有事务就以非事务的方式运行
3.MANDATOR:强制。使用当前事务,如果当前没有事务就抛出异常
4.REQUIRES_NEW:需要JTA事务管理器的支持。新建事务,如果当前存在事务,就把当前的事务挂起。
5.NOT_SUPPORTED:以非事务的方式执行操作,如果当前存在事务就把当前事务挂起。
6.NEVER:以非事务的方式运行,如果当前存在事务,就抛出异常
7.NESTED:嵌套,如果当前存在事务,就在嵌套事务中执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。- spring事务管理方式
1.编程式事务管理(了解)
2.声明式事务管理:
a.基于xm方式; step1.在spring组建中定义事务管理器组件,添加datasource注入;step2.添加事务aop配置(事务控制基于AOP思想)
// 配置事务管理组件
<bean id =“txManager” class=“org.springframework.jdbc.datasource.DataSourceTransactionManger”>
<property name=“dataSource” ref=“myDataSource”> <property>
</bean>//在配置文件中新增名为xmls:tx的配置
// 定义通知类型以及方面组件,advice相当于环绕型通知
<tx:advice id=“txAdvice” transaction-manager=“txManager”>
<tx:attributes>
<tx:method name=“方法名” > // 指定哪个方法需要用事务控制,可配置传播行为,是否只读等
<tx:method>
<tx:attributes>
<tx:advice>
// 定义切入点
<aop:config>
<aop:advisor advice-ref=“txAdvice” poinfcut=“within(包名)”>
<aop:advisor>
<aop:config>
b.基于注解方式 ;step1.需要保留,在spring组建中定义事务管理器组件,添加datasource注入;
step2.开启组件扫描(见aop开启组件扫描)
step3.启用事务注解
<tx:annotation-driven trancaction-manager=“txManager”> </tx:annotation-driven>
step4.在需要开启事务的方法上增加@Transactional()注解
注意:假如需要加事务的类实现了接口,需要使用CGLIB的方式创建代理类,需要在启用事务注解上面加上proxy-target-class="true"配置(目标组件是controller且其实现了其他接口)