spring学习(二)

  • 当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean 将会被装配来消除混乱。

  • 可以使用 @PostConstruct 注释作为初始化回调函数的一个替代,@PreDestroy 注释作为销毁回调函数的一个替代,
    被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法知性之后执行。
    spring学习(二)_第1张图片
    其实从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象a和对象p,才能执行注入。所以,如果一个类A中有个成员变量p被@Autowried注解,那么@Autowired注入是发生在A的构造方法执行完之后的。如果想在生成对象时完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。

    Constructor >> @Autowired >> @PostConstruct
    ```
    举个栗子:

      public Class AAA {
      
          @Autowired
      
          private BBB b;
      
      
          public AAA() {
      
              System.out.println("此时b还未被注入: b = " + b);
      
          }
      
          @PostConstruct
      
          private void init() {
      
              System.out.println("@PostConstruct将在依赖注入完成后被自动调用: b = " + b);
      
          }
      
      }
      ```
    
  • 你可以在字段中或者 setter 方法中使用 @Resource 注释,它和在 Java EE 5 中的运作是一样的。@Resource 注释使用一个 ‘name’ 属性,该属性以一个 bean 名称的形式被注入。你可以说,它遵循 by-name 自动连接语义。

  • @component:
    1、@controller 控制器(注入服务)
    用于标注控制层,相当于struts中的action层
    2、@service 服务(注入dao)
    用于标注服务层,主要用来进行业务的逻辑处理
    3、@repository(实现dao访问)
    用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.
    4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的)
    泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。

  • 基于 Java 的配置选项,可以使你在不用配置 XML 的情况下编写大多数的 Spring,但是一些有帮助的基于 Java 的注解

  • 带有 @Configuration 的注解类表示这个类可以使用 Spring IoC 容器作为 bean 定义的来源。@Bean 注解告诉 Spring,一个带有 @Bean 的注解方法将返回一个对象,该对象应该被注册为在 Spring 应用程序上下文中的 bean。
    当 @Beans 依赖对方时,表达这种依赖性非常简单,只要有一个 bean 方法调用另一个:return new Foo(bar());
    @import 注解允许从另一个配置类中加载 @Bean 定义。
    @Bean 注解支持指定任意的初始化和销毁的回调方法,就像在 bean 元素中 Spring 的 XML 的初始化方法和销毁方法的属性,例:@Bean(initMethod = “init”, destroyMethod = “cleanup” ),init和cleanup方法名自己定

  • 通过 ApplicationEvent 类和 ApplicationListener 接口来提供在 ApplicationContext 中处理事件。如果一个 bean 实现 ApplicationListener,那么每次 ApplicationEvent 被发布到 ApplicationContext 上,那个 bean 会被通知
    Spring 提供了以下的标准事件:
    1、 ContextRefreshedEvent
    ApplicationContext 被初始化或刷新时,该事件被发布。这也可以在 ConfigurableApplicationContext 接口中使用 refresh() 方法来发生。
    2、 ContextStartedEvent
    当使用 ConfigurableApplicationContext 接口中的 start() 方法启动 ApplicationContext 时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序。
    3、 ContextStoppedEvent
    当使用 ConfigurableApplicationContext 接口中的 stop() 方法停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作。
    4、 ContextClosedEvent
    当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启。
    5、 RequestHandledEvent
    这是一个 web-specific 事件,告诉所有 bean HTTP 请求已经被服务。
    由于 Spring 的事件处理是单线程的,所以如果一个事件被发布,直至并且除非所有的接收者得到的该消息,该进程被阻塞并且流程将不会继续。因此,如果事件处理被使用,在设计应用程序时应注意。
    为了监听上下文事件,一个 bean 应该实现只有一个方法onApplicationEvent() 的ApplicationListener 接口

  • 面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点。跨一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。依赖注入帮助你对应用程序对象相互解耦和 AOP 可以帮助你从它们所影响的对象中对横切关注点解耦
    术语:
    Aspect 一个模块具有一组提供横切需求的 APIs。例如,一个日志模块为了记录日志将被 AOP 方面调用。应用程序可以拥有任意数量的方面,这取决于需求。
    Join point 在你的应用程序中它代表一个点,你可以在插件 AOP 方面。你也能说,它是在实际的应用程序中,其中一个操作将使用 Spring AOP 框架。
    Advice 这是实际行动之前或之后执行的方法。这是在程序执行期间通过 Spring AOP 框架实际被调用的代码。
    Pointcut 这是一组一个或多个连接点,通知应该被执行。你可以使用表达式或模式指定切入点正如我们将在 AOP 的例子中看到的。
    Introduction 引用允许你添加新方法或属性到现有的类中。
    Target object 被一个或者多个方面所通知的对象,这个对象永远是一个被代理对象。也称为被通知对象。
    Weaving Weaving 把方面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时,类加载时和运行时完成。

  • Spring 中基于 AOP 的 XML架构:
    一个 aspect 是使用 元素声明的,支持的 bean 是使用 ref 属性引用的:
    一个切入点有助于确定使用不同建议执行的感兴趣的连接点(即方法):

    你可以使用 元素在一个 中声明五个建议中的任何一个:

    实例见:https://www.w3cschool.cn/wkspring/omps1mm6.html

你可能感兴趣的:(spring,Java,spring,java,aop)