【spring-04】
01 JdbcTemplate
00 spring 模版类
JdbcTemplate、HibernateTemplate、RedisTemplate、JmsTemplate
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="accountDao" class="com.spring.dao.impl.AccountDaoJdbcTemplateImpl">
<property name="template" ref="jdbcTemplate"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="springDataSource"></property>
</bean>
【spring内置数据源】
<bean id="springDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/springdemo"/>
<property name="username" value="root"/>
<property name="password" value="root123"/>
</bean>
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:jdbcConfig.properties"/>
</bean>
<bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
</beans>
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springdemo
jdbc.username=root
jdbc.password=root123
01 基于JdbcTemplate的CRUD
template.update("insert into acc、ount (name,money) values ('ddd',12.12)");
template.update("update account set money = 20 where id = 4");
template.update("delete from account where id = 4");
List<Account> accountList = template.query("select * from account where id != ?", new BeanPropertyRowMapper<Account>(Account.class), 4);
Account account = template.queryForObject("select * from account where id = ?", new BeanPropertyRowMapper<Account>(Account.class), 1);
Long count = template.queryForObject("select count(*) from account where id <> ?", Long.class, 0);
02 spring事务
01 spring事务管理器接口 PlatformTransactionManager
02 真正管理事务的对象
org.springframework.jdbc.datasource.DataSourceTransactionManager
用 使用 SpringJDBC 或 或 iBatis 进行持久化数据时使用
org.springframework.orm.hibernate5.HibernateTransactionManager
使用Hibernate
03 事务隔离级别
数据库默认隔离级别(以下其中一种)
读未提交、读已提交(oracle)、可重复性读(mysql)、序列化
04 事务的传播行为
REQUIRED:
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)
SUPPORTS:
支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)
MANDATORY:
使用当前的事务,如果当前没有事务,就抛出异常
REQUERS_NEW:
新建事务,如果当前在事务中,把当前事务挂起。
NOT_SUPPORTED:
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
NEVER:
以非事务方式运行,如果当前存在事务,抛出异常
NESTED:
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作。
05 超时时间
默认值是-1,没有超时限制。如果有,以秒为单位进行设置
03 基于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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="accountService" class="com.spring.service.impl.AccountServiceImpl">
<property name="accountDao" ref="accountDao"/>
</bean>
<bean id="accountDao" class="com.spring.dao.impl.AccountDaoJdbcTemplateImpl">
<property name="dataSource" ref="springDataSource"/>
</bean>
<bean id="springDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/springdemo"/>
<property name="username" value="root"/>
<property name="password" value="root123"/>
</bean>
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="springDataSource"/>
</bean>
<!--配置事物的通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 指定方法名称:是业务核心方法
read-only:是否是只读事务。默认 false,不只读。
isolation:指定事务的隔离级别。默认值是使用数据库的默认隔离级别。
propagation:指定事务的传播行为。
timeout:指定超时时间。默认值为:-1。永不超时。
rollback-for:用于指定一个异常,当执行产生该异常时,事务回滚。产生其他异常,事务不回滚。
没有默认值,任何异常都回滚。
no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时,事务回
滚。没有默认值,任何异常都回滚。
-->
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<!--配置aop-->
<aop:config>
<!--切入点表达式-->
<aop:pointcut id="pc_1" expression="execution(* com.spring.service.impl.*.*(..))"/>
<!--建立切入点表达式与事务通知的对应关系-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc_1"/>
</aop:config>
</beans>
04 基于注解的事务控制
【spring-03】
01 AOP Aspect Oriented Programming 面向切面编程
00 基础
动态代理
01 作用
在程序运行期间,不修改源码对已有方法进行增强
02 优势
减少重复代码、提高开发效率、维护方便
02 动态代理 基于接口 JDK 代理
01 接口、接口的实现类(被代理对象)、如何代理(InvocationHandler)
final Actor actor = new Actor();//直接
IActor proxyActor = (IActor) Proxy.newProxyInstance(
actor.getClass().getClassLoader(),
actor.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object rtValue = null;
rtValue = method.invoke(actor, args);
return rtValue;
}
});
03 动态代理 基于子类 cglib代理
01 类(不能是final)
<dependency>
<groupId>org.sonatype.sisu.inject</groupId>
<artifactId>cglib</artifactId>
<version>2.2.1-v20090111</version>
</dependency>
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(ProducerImpl.class);
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
String methodName = method.getName();
System.out.println(methodName);
Object ret = methodProxy.invokeSuper(o,objects);
return ret;
}
});
ProducerImpl producer = (ProducerImpl) enhancer.create();
04 Spring AOP
01 概念
Joinpoint( 连接点)
Pointcut( 切入点)
Advice( 通知/ 增强)
Introduction( 引介)
Target( 目标对象)
Weaving( 织入)
Proxy (代理)
Aspect( 切面)
02 基于 xml 的 AOP
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
</dependency>
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="logger" class="com.spring.aop.Logger"></bean>
<aop:config>
<aop:pointcut id="pc_1" expression="execution(* com.spring.aop.*.*(..))"/>
<!--order 数字小,优先级高-->
<aop:aspect id="logAdvice" ref="logger" order="2">
<aop:before method="beforePrintLog" pointcut-ref="pc_1"/>
<aop:after-returning method="afterReturnPrintLog" returning="retValue" pointcut-ref="pc_1"/>
<aop:after-throwing method="afterThrowingPrintLog" throwing="throwable" pointcut-ref="pc_1"/>
<aop:after method="afterPrintLog" pointcut-ref="pc_1"/>
<!--ProceedingJoinPoint is only supported for around advice-->
<!--<aop:around method="aroundPrintLog" pointcut-ref="pc_1"/>-->
</aop:aspect>
</aop:config>
</beans>
public Object aroundPrintLog(ProceedingJoinPoint joinPoint){
Object retValue = null;
try {
Object[] args = joinPoint.getArgs();
System.out.println("前置通知:---参数为:");
System.out.println(Arrays.toString(args));
retValue = joinPoint.proceed(args);
System.out.println("后置通知:---");
return retValue;
} catch (Throwable throwable) {
System.out.println("异常通知:---");
throw new RuntimeException(throwable);
}finally {
System.out.println("最终通知:---");
}
}
03 基于注解的AOP
<!-- 开启 spring 对注解 AOP 的支持 -->
<aop:aspectj-autoproxy/>
@Aspect// 表示当前类是一个切面类
@Pointcut("execution(* com.spring.aop.*.*(..))")
private void pt1(){}
@Before("pt1()")
public void beforePrintLog(){}
@AfterReturning(value = "pt1()",returning = "retValue")
public void afterReturnPrintLog(Object retValue){}
@AfterThrowing(value = "pt1()",throwing = "throwable")
public void afterThrowingPrintLog(Throwable throwable){}
@After("pt1()")
public void afterPrintLog(){}
@Around(value = "pt1()",argNames = "joinPoint")
public Object aroundPrintLog(ProceedingJoinPoint joinPoint){}
【spring-02】
01 基于 IOC 的 CRUD
01 void save(T t)
02 void update(T t)
03 void deleteById(Integer id)
04 T findById(Integer id)
05 List<T> findAll()
<bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
<constructor-arg name="ds" ref="comboPooledDataSource"></constructor-arg>
</bean>
<bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
02 基于注解
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--默认扫描该包以及子包的全部的类-->
<context:component-scan base-package="com.spring"></context:component-scan>
</bean>
@Component @Controller @Service @Repository
@Autowired @Qualifier
01 @Autowired
自动按照类型注入。
当使用注解注入属性时,set方法可以省略。
它只能注入其他 bean 类型。当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id
在 spring 容器查找,找到了也可以注入成功。找不到就报错。
02 @Qualifier
在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和
@Autowire 一起使用;但是给方法参数注入时,可以独立使用。
@Resource
@Value
注入基本数据类型和 String 类型数据的
@Scope @PostConstruct/*指定初始化方法*/ @PreDestroy/*指定销毁方法*/
03 纯注解【了解】
@Configuration @ComponentScan
@Bean(name = "dataSource") @Value("${jdbc.driver}")
@Import
ApplicationContext ac =
new AnnotationConfigApplicationContext(SpringConfiguration.class);
04 spring整合junit【掌握】
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
/**
* spring 5.0 版本需要对应 junit 4.12 版本
*/
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(classes = SpringConfig.class)
@ContextConfiguration(locations = "classpath:applicationContextAnnotation.xml")
UserServiceTest
【spring-01】
00 文档:spring-framework-5.0.2.RELEASE-docs/spring-framework-reference/index.html
01 spring
IOC 控制反转 Inverse Of Control
AOP 面向切面编程 Aspect Oriented Programming
02 spring 优势
01 方便解耦,简化开发
02 AOP 编程的支持
03 声明式事务的支持
04 方便程序测试
05 方便继承各种优秀框架
06 降低 JavaEE API 的使用难度
03 spring 体系结构
04 IOC
01 下载 spring【version:5.0.2】
01 link:http://repo.springsource.org/libs-release-local/org/springframework/spring
02 【注意】spring5 版本是用 jdk8 编写的
所以要求我们的 jdk 版本是 8 及以上。
同时 tomcat 的版本要求 8.5 及以上
02 AccountService AccountServiceImpl
03 AccountDao AccountDaoImpl
05 基于 xml
00 spring 依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
01 applicationContext.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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.spring.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.spring.service.impl.UserServiceImpl"
scope="singleton"
init-method="init" destroy-method="destroy">
<property name="userDao" ref="userDao"></property>
</bean>
<beans>
06 ApplicationContext
01 常用的三个子类
* 01 ClassPathXmlApplicationContext
* 02 FileSystemXmlApplicationContext
* 03 AnnotationConfigApplicationContext
07 IOC bean标签
id:给对象在容器中提供一个唯一标识。用于获取对象。
class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
scope:指定对象的作用范围。
* singleton :默认值,单例的.
* prototype :多例的.
* request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
* session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
* global session :WEB 项目中,应用在 Portlet 环境.如果没有 Portlet 环境那么
globalSession 相当于 session.
init-method:指定类中的初始化方法名称。
destroy-method:指定类中销毁方法名称。
08 实例化bean的三种方式
01 使用默认的无参数构造函数
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"/>
02 使用静态工厂的方法创建对象
public class StaticFactory {
public static IAccountService createAccountService(){
return new AccountServiceImpl();
}
}
<bean id="accountService"
class="com.itheima.factory.StaticFactory"
factory-method="createAccountService"></bean>
03 使用实例工厂的方法创建对象
public class InstanceFactory {
public IAccountService createAccountService(){
return new AccountServiceImpl();
}
}
<bean id="instancFactory" class="com.itheima.factory.InstanceFactory"></bean>
<bean id="accountService"
factory-bean="instancFactory"
factory-method="createAccountService"></bean>
09 DI 依赖注入(给属性赋值)
01 构造函数注入
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
<constructor-arg name="name" value=" 张三 "></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="myBirthday"></constructor-arg>
【指定格式的日期】
</bean>
<bean id="myBirthday" factory-bean="simpleDateFormat" factory-method="parse">
<constructor-arg value="1994-12-22"></constructor-arg>
</bean>
<bean id="simpleDateFormat" class="java.text.SimpleDateFormat">
<constructor-arg name="pattern" value="yyyy-MM-dd"></constructor-arg>
</bean>
02 set 方法注入
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
<property name="name" value="test"></property>
<property name="age" value="21"></property>
</bean>
03 集合属性输入
String[] myStrs
List<String> myList
Set<String> mySet
Map<String,String> myMap
Properties myProps
List结构:array、list、set[value]
Map结构:map、entry、props、prop
注入空值:<null></null>
|
|