IOC
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">
<context:component-scan base-package="包路径"/><!--用来扫描有注解的类,可以用注解代替-->
<context:property-placeholder location="classpath:*.properties"/><!--外部属性文件,classpath:表示resources下文件,一定要加-->
<bean id="id" class="类全名" [scope="singleton(单例)/prototype(多例)"] [init-method="初始化方法"] [destroymethod="摧毁方法"]>
<!--构造方法注入-->
<constructor-arg index="参数索引" value="value"/><!--通过参数索引-->
<constructor-arg name="参数名" value="value"/><!--通过参数名-->
<!--setter注入-->
<property name="字段1" value="value"/><!--基本数据类型-->
<property name="字段2"><!--集合-->
<对应类型标签>
<value>value</value>
</对应类型标签>
</property>
<property name="字段3"><!--内部创建类-->
<bean class="类全名">
<property name="字段" value="value"/>
</bean>
</property>
<property name="字段3" ref="其他bean" /><!--引用其他bean-->
</bean>
</beans>
注解
@Controller(["id"]) 视图层/@Service 业务层/@Repository 持久层/@Configuration 配置类/@Component: 其他类
@Scope("singleton"(单例)/"prototype"(多例))
//配置类中注解
@ComponentScan("包路径")//代替xml包扫描
@PropertySource("*.properties")//代替xml外部属性文件
public class Bean {
@Autowired(required = true/false)//根据数据类型注入容器中对象
@Value("value")//注入基本数据类型数据
private Object filed1;
@PostConstruct//构造方法后
public void postConstruct(){}
@PreDestroy//销毁前
public void preDestroy(){}
}
获取
//xml配置方式,配置有包扫描可以获取注解方式对象
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("*.xml");
//注解方式,获取不到xml配置方式对象
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(启动类.class);
//根据对象id获取
context..getBean("id");
//根据对象类型获取
context.getBean(类名.class);
AOP
配置切面
XML
<!--执行切面类方法-->
<aop:config>
<aop:aspect ref="切面类">
<aop:pointcut id="切入点" expression="切入点表达式"/><!--配置切入点-->
<aop:通知生命周期 method="切面类方法" pointcut-ref="切入点"/>
</aop:aspect>
</aop:config>
<!--添加事务-->
<!--事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--事务管理规则-->
<tx:advice id="事务名">
<tx:attributes>
<tx:method name="方法名(可以拼接*)" propagation="传播行为" read-only="查询操作设置为true"/>
</tx:attributes>
</tx:advice>
<!--切入点-->
<aop:config>
<aop:pointcut id="切入点" expression="切入点表达式"/><!--配置切入点-->
<aop:advisor advice-ref="事务名" pointcut-ref="切入点表达式"/>
</aop:config>
注解
开启自动代理
<!--@Aspect支持-->
<aop:aspectj-autoproxy/>
<!--@Transactional支持-->
<tx:annotation-driven/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
@Component
@Aspect//标记为切面类
public class 切面类{
//定义切入点,再引用切入点
@Pointcut("切入点表达式")
public void pointcut(){}
@生命周期("pointcut()")
public void funtion(){}
//直接定义切入点
@生命周期("切入点表达式")
public void funtion(){}
//事务
@Transactional(
readOnly = 查询操作设置为true,
propagation = 传播行为,
rollbackFor = {遇到指定异常.class回滚},
noRollbackFor = {遇到指定异常.class不回滚}
)
public void funtion(){}
}
环绕方法
ProceedingJoinPoint为正在执行的切入点方法
proceedingJoinPoint.proceed()执行切入点方法
//使用注解时生命周期为@Around("")
public Object bean(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Object[] args = proceedingJoinPoint.getArgs();//获取切入点参数
Object object = proceedingJoinPoint.proceed(args);
return object;
}
切入点表达式
..匹配0到多个包/匹配0到多个参数
*匹配所有返回类型/匹配当前目录下所有类/在bean表达式中拼接字符串(*Service)
指定方法
execution(返回类型 包.类.方法(参数类型))
指定类中所有方法
within(包.类)
指定对象
bean(对象)
生命周期
before 执行前
after-returning 返回前
after-throwing 异常
after 最终,出异常也会进
around 环绕,在方法里配置执行
传播行为
REQUIRED 已经有事务,加入事务中执行;否则则新建一个事务
SUPPORTS 已经有事务,加入事务中执行:否则以非事务方式执行
JdbcTeamplate
放入容器
<context:property-placeholder location="*.properties"/><!--外部属性文件-->
<!--数据源对象-->
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${driver}"/>
<!--username和password加上前缀,否则会获取到系统的用户名密码-->
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="url" value="${url}"/>
</bean>
<!--jdbcTemplate-->
<bean class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" value="datasource"/>
</bean>
执行
sql语句用?占位,根据参数顺序赋值
查询
jdbcTemplate.query(String sql, new RowMapper<Object>() {
@Override
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
每行数据进入一次方法
return 封装ResultSet中数据的Object;
}
},Object... args);
//其他操作都使用update
jdbcTemplate.update(String sql,Object... args);