Spring学习
IOC(控制反转)
Inverse of Control∶ 控制反转
反转了依赖关系的满足方式,由之前的自己创建依赖对象,变为由工厂推送。(变主动为被动,即反转解决了具有依赖关系的组件之间的强耦合,使得项目形态更加稳健
头部配置
<?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 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
</beans>
IOC为属性赋值(控制反转思想)
<bean id ="userService" class="com.lang.service.impl.UserServiceImpl">
<property name="userDao" ref="依赖的ID名"/><!--依赖关系-->
</bean>
DI依赖注入(实操)
Set注入
自建类型用ref
<bean id ="userService" class="com.lang.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
基本数据类型用valu
数组相关用对应的关键字
<set/list....>
<value></value>
</set/list...>
构造注入
<constructor-arg name="" value="">
自动注入
用autowire属性
这样业务层的dao会自动查找统一配置文件和属性名相同的bean的id
还可以用byType
<bean id ="userService" class="com.lang.service.impl.UserServiceImpl" auowire="byName">
</bean>
bean的创建模式
单例模式
工厂创建时创建同一个对象之创建一次,外界获取的是同一个对象
singleton
多例模式
每次调用工厂都是一个新的对象
工厂特性
饿汉式创建优势
工厂创建之后,会将Spring配置文件中的所有对象都创建完成(饿汉式)。 提高程序运行效率。避免多次IO,减少对象创建时间。(概念接近连接池,一次性创建好,使用时直接获取)
生命周期方法
自定义初始化方法∶添加"init-method"属性,Spring则会在创建对象之后,调用此方法。自定义销毁方法∶添加"destroy-method属性,Spring则会在销毁对象之前,调用此方法。销毁∶工厂的close((方法被调用之后,Spring会毁掉所有已创建的单例对象。分类∶Singleton对象由Spring容器销毁、Prototype对象由JVM销毁。
生命周期阶段
生命周期注解
@PostConstruct初始化
@PreDestroy销毁
代理设计模式
将核心功能与辅助功能(事务、日志、性能监控代码)分离,达到核心业务功能更纯粹、辅助业务功能可复用。
静态代理设计模式
动态代理模式
动态创建代理类的对象,为原始类的对象添加辅助功能。
AOP
AOP(AspectOriented Programming),即面向切面编程,利用一种称为"横切的技术,剖开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
作用
通过动态代理类为原始类的方法添加辅助功能
AOP的依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
定义切入点
<!--修饰符 返回值 包.类 方法名 参数表,以下是编制的功能-->
<aop:config>
<!--修饰符 返回值 包.类 方法名 参数表-->
<aop:pointcut id="pc_shine" expression="execution(* save())"/>
<!--组装-->
<aop:advisor advice-ref="advice功能" pointcut-ref="pc_shine"></aop:advisor>
</aop:config>
表达式写法
后处理器
Spring整合mybatis
1、连接池
jdbc.username=root
jdbc.password=123456
jdbc.url=jdbc:mysql://localhost:3306/lang?useUnicode=true&characterEncoding=utf-8
jdbc.driver=com.mysql.jdbc.Driver
2、连接池配置
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/><!--通过${}来取配置文件的值-->
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="initialSize" value="${jdbc.init}"/>
<property name="minIdle" value="${jdbc.minIdle}"/>
<property name="maxActive" value="${jdbc.maxActive}"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations">
<list>
<value>classpath:com/lang/dao/*.xml</value>
</list>
</property>
<property name="typeAliasesPackage" value="com.lang.entity"/>
</bean>
<bean id="mapperScannerConfiguer9" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--dao接口所在的包-->
<property name="basePackage" value="com.lang.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
</beans>
3 、事务管理器
<bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
4、配置事务通知
<tx:advice id="txManager" transaction-manager="tx">
<tx:attributes>
<!--以User为结尾的方法-->
<tx:method name="*User" read-only="true" isolation="READ_COMMITTED" rollback-for="Exception"/>
<!--以query开头的方法,切入此方法时,采用对应事务实行-->
<tx:method name="query*" propagation="SUPPORTS"/>
<!--剩余所有方法-->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
注解开发
声明bean
@Service业务类专用
@Repository dao实现类专用
@Controller web层专用
@Component 通用
@Scope 用户控制bean的创建模式
注入
@Autowired 根据类型自动注入
@Qualifier(“”) 根据类型,并根据名称使用 和上面联合使用
@Resource(name=“”) 根据名称自动注入
@Value(“”)简单类型注入
事物控制
@Transactional(rollbackFor=Exception,class) 也可以为方法单独加 放在事务层
注解需要的配置
告诉spring注解的位置
<context:component-scan base-package="com.lang" ></context:component-scan>
支持事务控制
<tx:annotation-driven transaction-manager="tx"/>
AOP注解
@Aspect
@Compont开头
类
@Before
@Around
@AfterThrowing
@AfterReturning(returning=“返回的参数值”)
Spring 集成juint
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
在类上注解
@Runwith(SpringJUint4ClassRunner.class)
@ContextConfiguration(“classpath:applicationContext.xml”)
那样就可以不在测试类中启动spring工厂