1.课程介绍
1. 依赖注入;(掌握)
2. XML自动注入;(了解)
3. 全注解配置;(掌握)
4. 代理模式;(掌握,超难)
5. AOP;(掌握)
6. Bean的创建方式(掌握)
一,依赖注入
什么是依赖注入
一个类里面依赖于另一个类,然后spring把类的对象创建出来,然后注入到相应的类里面去
依赖注入的方式:
set方法注入
构造器方法注入
注解式方法注入
!-- 构造器注入 index索引注入方式-->
<!--<constructor-arg index="0" value="5"></constructor-arg>
<constructor-arg index="1" value="小王"></constructor-arg>-->
<!-- 构造器注入 通过name注入-->
<!-- <constructor-arg name="id" value="1"></constructor-arg>
<constructor-arg name="name" value="老王"></constructor-arg>-->
<!--构造器注入 通过type类型注入-->
<!--
<constructor-arg type="java.lang.Long" value="1"></constructor-arg>
<constructor-arg type="java.lang.Long" value="18"></constructor-arg>
<constructor-arg type="java.lang.String" value="剑锋"></constructor-arg>-->
<!--类里面有一个属性是对象 怎么注入 -->
<constructor-arg name="id" value="1"></constructor-arg>
<constructor-arg name="name" value="yyy"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<!-- <constructor-arg name="hb" ref="hb"></constructor-arg>-->
<constructor-arg name="hb">
<bean class="cn.itsource._01_di.HelloBean"></bean>
</constructor-arg>
数组两种方式
简写:
<!--<property name="arrays" value="1,2,3"></property>-->
完整写法:
<property name="arrays">
<array>
<value>币</value>
<value>钱</value>
<value>命</value>
</array>
</property>
二,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"
default-autowire="byType">
<bean id="userDao" class="cn.itsource._02_xmlauto.UserDao"></bean>
<bean id="userService" class="cn.itsource._02_xmlauto.UserService"></bean>
<bean id="userServicex" class="cn.itsource._02_xmlauto.UserService"></bean>
<bean id="userController" class="cn.itsource._02_xmlauto.UserController" autowire="byName">
</bean>
</beans>
三,全注解配置
配置让Spring扫描类与支持注解
<!-- 开启扫描 controller service repository component-->
<context:component-scan base-package="cn.itsource._03_anno"/>
配置dao层进行注解
Repository("jpaDao")
public class UserJpaDao implements IUserDao{
public void save() {
System.out.println("jpa保存数据");
}
}
配置service层进行注解
@Service
public class UserService implements IUserService {
@Resource(name = "jpaDao")
private IUserDao userDao;
public void save() {
userDao.save();
}
}
配置controller层进行注解
@Controller
@Scope("prototype")
public class UserController {
@Autowired
private IUserService userService;
public void save(){userService.save();}
}
四,AOP面向切面
AOP
它是spring一个特性,面向切面的编程
什么叫面向切面的编程:
它的产生并不是取代面型对象,而是扩展,把类切开(切到方法上面)
可以往方法前后添加一些逻辑
什么叫面向对象编程
万事万物皆对象,使用对象思维操作编程。
Aop使用场景:
事务管理
日志管理
性能监控
拦截器
Aop实现
底层是通过代理模式实现–代理模式jdk/cglib动态代理
public class TxManager {
public void begin(){
System.out.println("事物开启");
}
public void commit(){
System.out.println("事物提交");
}
public void rollback(Throwable e){
System.out.println("事物回滚"+e.getMessage());
}
public void close(){
System.out.println("事物关闭");
}
//环绕通知
@Around("pointcu()")
public void around(ProceedingJoinPoint joinPoint){
String methodName = joinPoint.getSignature().getName();
try {
if("find".equals(methodName) || "query".equals(methodName)){
//去执行方法 save
joinPoint.proceed();
}else {
//事物开启
begin();
System.out.println(joinPoint.getSignature().getName());
//去执行方法 save
joinPoint.proceed();
//事物提交
commit();
}
} catch (Throwable e) {
e.printStackTrace();
//报错就回滚
rollback(e);
}finally {
if("find".equals(methodName) || "query".equals(methodName)) {
}else{
close();
}
}
}
五,代理模式
了解能理解多深就多深
代理模式
静态代理:如果对多个接口或者多个方法,写很多额外的代理实现
动态代理
实现了解
动态代理 jdk(有接口) cglib(没有接口代理)