目录
(1) IOC: 控制反转,把创建对象过程交给 Spring 进行管理
md格式的笔记
spring5
1.核心 IOC AOP
(1) IOC: 控制反转,把创建对象过程交给 Spring 进行管理
1.IOC 的底层原理
概念:控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。*通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。*(把对象创建和调用都交给Spring管理)
目的:使用IOC的目的就是为了解耦合
原理:xml解析 工厂模式 反射
IOC过程 :第一步配置xml
第二步:创建工厂类 : 有了service类和dao类,创建工厂类
class UserFactory {
public static UserDao getDao(){
String classValue = class 属性值; //从xml中获得
Class cs = Class.forName(classValue);
return (UserDao)cs.newInstance(); //通过反射的方法获得对象
}
}
2.IOC 接口(BeanFactory)
IOC思想基于IOC容器完成,其最底层就是工厂模式
SPringle提供IOC容器实现的两种方式(两个接口)
** BeanFactory**: IOC容器的最基本的实现方式(开发中不使用,是spring内部进行开发使用)
加载配置文件的时候不会创建对象,只有使用的时候才会创建对象
ApplicationContext:BeanFactory的子接口 加载配置文件的时候就会创建对象。 他有实现类.
使用他可以好找对象,
有: FileSystemXmlApplicationContext(绝地地址)
ClassPathXmlApplicationContext (src下直接找到xml)
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("src/main/java/com/example/spring5text/xml/Bean.xml");
Bean管理指的是两个操作:Spring创建对象;Spring注入属性
3.IOC操作Bean管理(基于xml)
(1)创建对象
在Spring配置文件中使用bean标签,标签里面添加对应的属性
id:唯一标识
class:类的全路径
创建对象的时候默认执行的是无参构造方法
其余的比较复杂一般不使用,用基于注解去进行Bean管理
4.IOC操作Bean管理(基于注解)
注解是代码的特殊标记,使用在类上,其目的是简化xml配置
(1)Spring针对Bean管理创建对象提供的注解
@Component
@Service
@Controller
@Repository
类似于
配置好了需要在xml中配置包的扫描路径(使用SpringBoot的就可以直接使用@SpringBootApplication 他会自动扫描主程序所在的包及其子包) (2)Spring针对属性注入的注解
@Autowired:自动根据类型注入 (里面可以有参数) @Qualifier(“名称”):指定自动注入的id名称
这个@Qualifier 注解的使用,和上面@Autowired 一起使用
@Value:注入普通类型属性
@Resource(“名称”) @ PostConstruct 自定义初始化 @ PreDestroy 自定义销毁
如果是静态方法中需要注入对象就必须使用
@ PostConstruct 自定义初始化
@Autowired
private KpiManageIpConfig ipConfig; //注入的对象
private static ManageLoginUtil manageLoginUtil; //自己的类,里面有静态方法
//因为静态方法是在注入对象之前就开始初始化的
@PostConstruct
public void init(){
manageLoginUtil=this;
manageLoginUtil.ipConfig = this.ipConfig;
}
或者使用这个
@Configuration //作为配置类,替代 xml 配置文件
(2) AOP: 面向切面,不修改源代码进行功能增强
概念:
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
1.AOP底层使用动态代理
有两种情况动态代理
(1)有接口的情况 ,使用jdk的动态代理
创建接口实现类的代理对象,增强类的方法
(2)没有接口的情况,使用CGLIB的动态代理
创建子类的代理对象,增强类的方法
2.jdk的动态代理
使用Proxy类里面的方法创建动态代理对象
调用newProxyInstance 方法 返回指定接口的代理类的实例,改接口将方法调用分配给指定的调用处理程序。
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
方法有三个参数: 第一参数,类加载器 第二参数,增强方法所在的类,这个类实现的接口,支持多个接口 第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分
第一参数是当前类的类加载器 一般是 xxx.class.getClassLoader()
第二个参数是需要进行代理的接口的类 xxx.class
第三个参数是自己写的增强方法 ,这个实现InvocationHandler接口
主要的增强方法还是在这个接口中实现,在这个接口是现实逻辑
常用术语
1.连接点:类里那些方法可以被增强,这些方法就称为连接点
2.切入点: 实际被真正增强的方法,称为切入点
3.增强(通知): 在真正增强的逻辑部分称为增加(通知)‘
常见的通知有
前置通知
后置通知
环绕通知
异常通知
最终通知
4.切面:把通知应用到切入点的过程 (是一个动作)
3.AOP操作(准备工作)
(1)Spring框架使用的事Aspectj来实现Aop操作
Aspectj不属于Spring框架
(2)基于Aspectj实现Aop操作
有两种方式:
1.基于xml配置
2.基于注解方式
(3)切点表达式
目的:知道对那个类的那些方法被增强
语法结构: execution([权限修饰符] [返回类型] [类全路径] 方法名称)
一般是
对 com.text.UserServiceImpl 下的getList(..)方法进行增强
execution(* com.text.UserServiceImpl.getList(..))
或者
对 com.text.UserServiceImpl 下的所以方法进行增强
execution(* com.text.UserServiceImpl. * .(..))
4.AOP操作(AspectJ注解)
@Aspect 说明是切面
@Before 通知类型之前
@Aroud 通知类型 环绕
@pointcut(value=“”)切入点
在增强类上面添加注解 @Order(数字类型值),数字类型值越小优先级越高
@SpringBootApplication 等同于 @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan("com.boot")
这就是springboot的强大之处