欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring入门

程序员文章站 2022-07-12 13:03:14
...

Spring体系结构

Spring入门

  • Spring的核心是控制反转(IOC)和面向切面(AOP),IOC中的DI(依赖注入)实现了解耦,接口+实现类==》接口+setter()方法;AOP进一步解耦,纵向继承变为了横向抽取。

IOC

  • 正常创建对象直接new,有了spring之后,将由Spring创建对象实例,从spring工厂(容器)中获得,需要将实现类的全限定名称配置到xml文件中。这就是控制反转。

DI

  • 依赖:一个对象需要使用另一个对象;注入:通过setter方法进行另一个对象实例设置。DI实现了解耦,接口=new一个实现类转换成了接口+setter()方法实现两个对象之间的解耦。

AOP

  • 经典应用场景:事务管理,性能监控等。
  • 实现原理:aop底层采用代理机制(反射生成代理)进行实现。接口 + 实现类的情况下spring可采用jdk动态代理Proxy。只有实现类无接口的情况下spring采用cglib字节码增强。
  • 基本概念一个图说明一切:
    Spring入门
  • 动态代理的理解:其实就是对装饰设计模式的一种简化
  • cglib字节码增强与jdk动态代理的区别(3个):前者不需要接口;前者需要依赖第三方类库;前者实现原理实际上是继承,生成子类,因此该类或方法最好不要声明final.
public class MyBeanFactory {//编写一个工厂去生成代理类

    public static UserService createService(){
        //1 目标类
        final UserService userService = new UserServiceImpl();
        //2切面类
        final MyAspect myAspect = new MyAspect();
        /* 3 代理类:将目标类(切入点)和 切面类(通知) 结合 --> 切面
         *  Proxy.newProxyInstance
         *      参数1:loader ,类加载器,动态代理类 运行时创建,任何类都需要类加载器将其加载到内存。
         *          一般情况:当前类.class.getClassLoader();
         *                  目标类实例.getClass().get...
         *      参数2:Class[] interfaces 代理类需要实现的所有接口
         *          方式1:目标类实例.getClass().getInterfaces()  ;注意:只能获得自己接口,不能获得父元素接口
         *          方式2:new Class[]{UserService.class}   
         *          例如:jdbc 驱动  --> DriverManager  获得接口 Connection
         *      参数3:InvocationHandler  处理类,接口,必须进行实现类,一般采用匿名内部
         *          提供 invoke 方法,代理类的每一个方法执行时,都将调用一次invoke
         *              参数31:Object proxy :代理对象
         *              参数32Method method : 代理对象当前执行的方法的描述对象(反射)
         *                  执行方法名:method.getName()
         *                  执行方法:method.invoke(对象,实际参数)
         *              参数33:Object[] args :方法实际参数
         * 
         */
        UserService proxService = (UserService)Proxy.newProxyInstance(
                                MyBeanFactory.class.getClassLoader(), 
                                userService.getClass().getInterfaces(), 
                                new InvocationHandler() {

                                    @Override
                                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                                        //前执行
                                        myAspect.before();

                                        //执行目标类的方法
                                        Object obj = method.invoke(userService, args);

                                        //后执行
                                        myAspect.after();

                                        return obj;
                                    }
                                });

        return proxService;
    }

}

Transactions

Spring注解

  • 注解就是一个类,使用@+注解名称取代 xml配置文件。
  • 注解使用前提,添加命名空间,让spring扫描含有注解类
xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context.xsd">
  • @Component 取代 bean class=””
  • @Repository :dao层 取代 bean class=””
  • @Service:service层 取代 bean class=””
  • @Controller:web层 取代 bean class=”” 以上四个是等效的
  • @Value(“”) 对普通值依赖注入
  • @Autowired 对引用值依赖注入
  • @Scope(“prototype”) 实现多例
  • @PostConstruct 生命周期中初始化
  • @PreDestroy 生命周期中销毁