IOC
IoC实现方法:
工厂模式: 工厂生产某个类,解耦合。
IOC底层原理:xml解析、工厂模式、反射
FileSystem文件路径,ClassPath类路径
2.Bean管理操作两种方式:
-
1.配置xml文件方式
-
创建对象:
<bean id=“user” class=“com.guigu.User”></bean>
id标识(或者用name,它可以加特殊符号);class路径
创建对象的时候,默认无参构造。 -
注入属性://DI: 依赖注入(注入属性)
1.用set方法注入(xml中编辑)
2.或者有参构造方法注入
或者(不常用):
内容中如果存在特殊符号:
3.外部bean注入(对象属性)
4.属性注入(内部bean)
5.级联赋值(就是外部new一个bean+给它赋值)(或者用a.b=” “也可)
-
-
注入集合、数组:
普通bean(定义类型和返回类型相同)和工厂bean(实现FactoryBean接口,定义类型和返回类型可以不同)。
bean的作用域:就是设置单实例(每次获取到的对象相同)还是多实例,默认单实例。(通过输出地址可以进行区分)设置scope属性,singleton(默认)和prototyoe。
第三步前后都可以加后置处理器(实现BeanPostProcessor)
- 自动装配:bean 中有autowire属性:byName或者byType
外部属性文件注入:
- 2.注解方式
2.1什么是注解
Spring中针对Bean提供的注解:
(1)@Component
(2)@Service
(3)@Controller
(4)@Repository - 四个注解功能一样,创建bean实例。
注: 要注入aop依赖
- 开启组件扫描:
还可以设置扫描范围:
哪些不扫描:
Spring注入属性所用到的注解:
(1)@Autowired:根据属性类型注入
(2)@Qalifier:根据属性名称注入
(3)@Resource:都可以
(4)@Value:普通类型注入 - 完全注解开发(xml换成配置类)
变化:
xml扫描换成配置类:
测试方式略有不同:
AOP
1.概念
AOP底层:
-
1.动态代理:
有接口情况:JDK动态代理
无接口情况:CGLIB动态代理
java.lang.Proxy代理类
-
AOP术语:
-
(1)连接点:类里面可以被增强的方法
-
(2)切入点:实际被增强的方法
-
(3)通知(增强):实际增强的逻辑部分成为通知(增强)
- 前置通知:在方法前置性(Before)
- 后置通知:在方法后执行(AfterReturning)
- 环绕通知:前后都有(Around)
- 异常通知:方法出现异常会执行(AfterThrowing)
- 最终通知:类似finally(After)
-
(4)切面:把通知应用到切入点的过程
切入点表达式(对哪个类的哪个方法进行增强):
2.基于AspectJ (不是spring框架,独立AOP框架) 完成AOP操作:
(1)基于xml文件
(2)基于注解方式
- 用到的xml内存空间:context和aop。
*
(4)<aop: aspectj-autoproxy></aop: aspectj-autoproxy>(扫描@aspect注解)
@Aspect
@Component
public class ProxyClass {
//前置
@Before(value = "execution(* com.guigu.spring.aop.NewUser.sum(..))")
public void before(){
System.out.println("before....");
}
//后置
@AfterReturning(value = "execution(* com.guigu.spring.aop.NewUser.sum(..))")
public void afterRturning(){
System.out.println("afterRturning....");
}
//最终
@After(value = "execution(* com.guigu.spring.aop.NewUser.sum(..))")
public void after(){
System.out.println("after....");
}
//异常
@AfterThrowing(value = "execution(* com.guigu.spring.aop.NewUser.sum(..))")
public void afterThrowing(){
System.out.println("afterThrowing....");
}
//环绕
@Around(value = "execution(* com.guigu.spring.aop.NewUser.sum(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("around before....");
proceedingJoinPoint.proceed();
System.out.println("around latter....");
}
}
5.相同切入点抽取
用的时候直接写方法名称。
6.多个增强类增强同一个方法(设置优先级):
@Order(数字)越小优先级越高
小补充:也可以完全基于注解开发:
替换为: