Spring复习笔记

1.IOC

把对象交给spring容器管理,spring容器来帮我们创建对象,并管理对象的声明周期
Ioc主要是控制反转和依赖注入这两个点,控制反转就是让spring控制对象,原先对象是我们自己管理,依赖注入则是当我们需要调用对象时使用注解或xml的方式让spring容器实现自动注入。
如果一个类需要调用另一个类的方法,通常我们是去new另一个类的对象,如果频繁的去创建对象,不方便测试,代码即冗余耦合度也比较高,spring帮助我们省去了这些实例化对象的步骤,我们可以采用xml配置或注解声明的方式来简化这些操作
在这里插入图片描述

2.BeanFactory与ApplicationContext 区别

(1)BeanFactory容器内部使用的接口,ApplicationContext 是BeanFactory的子接口
(2)BeanFactory在调用getBean()时实例化bean,ApplicationContext 在容器起动时实例化bean,不会等待调用getBean()时再实例化
(3)一般使用ApplicationContext的实现类ClassPathXmlApplicationalContext
ApplicationContext context = new ClassPathXmlApplicationalContext(配置文件);
Context.getBean();
在这里插入图片描述
在这里插入图片描述

3.spring springmvc springboot 的区别

(1)spring是java开发框架,核心是ioc aop
(2)Springmvc是spirng的web开发框架,是基于Servlet的MVC框架,包含了前端视图开发,复杂的文件配置,后端接口
(3)Springboot是开发微服务后端接口的,不开发前端视图,相对于springmvc简化了配置
在这里插入图片描述

4.AOP

Aop思路:
Spring中有很多与业务逻辑无关的代码,比如日志、事务、权限等,这些代码经常需要融入到业务代码中,但是给每一个业务代码都添加这些代码有些冗余,于是我们将这些公共的代码抽象出来变成一个切面,当我们需要使用这些代码的时候,只需要将它注入到目标对象即可,也就是通过注解标作为标识,表示这些业务代码需要被注入,那么容器通过扫描注解,就会将公共代码自动注入这些含有注解的业务代码中,注入不会影响原有业务代码
Aop实现原理:
利用动态代理实现,将需要注入的对象进行代理
在这里插入图片描述

5.如何自定义工厂bean

(1)自定义工厂bean,需实现FactoryBean接口并重写方法
(2)bean可以设置为单实例对象或多实例实例,spring默认单实例对象
单实例对象:getBean()不管从容器中获取多少次对象,它们都是同一个对象
在这里插入图片描述

6.singleton单实例对象和prototype多实例对象的区别?

(1)设置bean的作用域,bean标签上设置scope = singleton/prototype
(2)设置scope = singleton时,加载配置文件就会创建单实例对象
(3)设置scope = prototype时,加载配置文件时不会创建对象,在getBean()获取对象时创建多实例对象
在这里插入图片描述

7.Bean的生命周期

bean从创建到销毁的过程
(1)执行空参构造器实现化bean
(2)执行set方法设置属性值
(3)执行初始化方法initMethod
(4)获取bean的实例化对象,getBean(“类名首字母小写”,类名.class);
(5)执行销毁方法destoryMethod
在这里插入图片描述

8.Spring注解

(1)给容器注入组件,声明这是一个bean,在类上声明
@Component 泛指各种组件
@Service 业务层组件
@Controller 控制层组件
@Repository 数据访问层组件
@Configuration 声明为配置类
在这里插入图片描述
在这里插入图片描述
声明注解需要开启注解扫描,使用配置xml配置或者使用注解@ComponentScan(basePackges = “需要扫描的类”)
在这里插入图片描述
(2)实现自动注入
@Autowired 根据属性类型注入
在这里插入图片描述

@Qualifier 根据名称注入,与@Autowired一起使用
在这里插入图片描述

@Resource 可以根据类型注入也可以根据名称注入
在这里插入图片描述

@Value 注入普通类型属性
在这里插入图片描述

(3)@Bean
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用xml方式配置一个类,并在容器起动时创建这个类并调用set方法设置属性值,@Bean的作用和这个一样,会自动创建类,并给属性赋值
SprignBoot中 @Bean 完美的替换了了上面的这种在xml中配置的方法。使用以下方法就能让spring在需要自动创建Info对象时,自动调用这个方法。
在这里插入图片描述

9.动态代理

Jdk动态代理和cglib动态代理
有接口使用JDK动态代理,创建接口实现类的代理对象,增强类的方法
没接口使用CGLIB动态代理,子类的代理对象,增强类的方法
在这里插入图片描述
获取代理类的实例
Proxy.newProxyInstance(类加载器,接口类型的数组,InvocationHandler接口的实现类);
(1)类加载可以使用主函数类的类加载器
(2)InvocationHandler接口的实现类需要传入被代理的对象
在这里插入图片描述
Invoke()方法:
处理被代理类的方法并返回结果,将被代理类需要执行的方法声明在invoke()方法中
代理类的每一个方法执行时,都将调用一次invoke()
在这里插入图片描述

package Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface Phone{
    void photograph();
}
class PhoneImpl implements Phone{
    @Override
    public void photograph() {
        System.out.println("拍照~");
    }
}
public class ProxyTest {
    public static void main(String[] args) {
        Class[] phoneArray = {Phone.class};
        Phone proxyInstance = (Phone) Proxy.newProxyInstance(
                ProxyTest.class.getClassLoader(), phoneArray, new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        return method.invoke(new PhoneImpl(),args);
                    }
                });
        proxyInstance.photograph();
    }
}

//public class ProxyTest {
//    public static void main(String[] args) {
//        Class[] phoneArray = {Phone.class};
//        Phone proxyInstance = (Phone) Proxy.newProxyInstance(
//                ProxyTest.class.getClassLoader(), phoneArray, new InvokeTest(new PhoneImpl()));
//        proxyInstance.photograph();
//    }
//}
//
//class InvokeTest implements InvocationHandler {
//    public Phone phone;
//
//    public InvokeTest(Phone phone){
//        this.phone = phone;
//    }
//
//    @Override
//    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//        return method.invoke(phone,args);
//    }
//}

10.使用@Aspect注解实现aop操作

@Aspect注解声明一个类为切面容器,通常和@Component一起使用,@Aspect不是spring提供的注解
AOP的作用就是将与业务逻辑无关的代码的代码单独放在一个地方(切面容器),再通知的注解上指定需要被增强(增强就是给代码添加功能)的方法是那些,使用通知注解实现自动增强,如果使用原始方式增强方法,需要给每个需要增强的方法都添加代码,这样耦合性太高,代码过于冗余,不利于修改,使用面向切面的思想就能解决代码冗余的问题

  • 连接点:可以被增强的方法
  • 切入点:已经被增强的方法
  • 通知:增强代码的逻辑部分,一般为事务,权限,日志,监听
  • 切面:把通知应用到切入点的过程

1.通知分为:

  1. 前置通知@Before:方法执行之前通知
  2. 后置通知@After:方法完成之后通知
  3. 环绕通知@Around:方法执行之前通知和方法完成之后通知
  4. 返回通知@AfterReturning:方法成功执行之后通知
  5. 异常通知@AfterThrowing:方法抛异常时通知,作用和finally一样,异常通知也叫最终通知

2.execution的格式
*表示任意 …表示任意参数
在这里插入图片描述
在这里插入图片描述
3.@Pointcut
可以在一个切面内定义可重用的切点
4.@Order
多个类的多个方法通知增强同一个方法时可以设置类的优先级,这个注解声明在类上
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值