内置的类指明bean及相应的依赖关系,下面展开叙述。
@Configuration可以声明某个类是作为配置类,在这样的类中
通过@Bean进行修饰的方法可以返回相应的bean类
通过由AnnotationConfigApplicationContext初始化的Application的getBean
方法(以类名.class为参数)即可得到相应bean实例。
(其找到相应bean类的方式可以相应地理解为byType)
可以在最后实现文件中加载多个configure类,相应参照网站(register refresh)
同样地可以对bean实现依赖注入的功能。(即bean间的依赖)
这可以通过构造函数的方式进行,@Bean函数的构造返回与类的初始化方式相一致。
使用@Import(ConfigClass.class)对具有@Configuration的配置类进行修饰
可以使得在该配置类中使用ConfigureClass中定义的bean作为依赖。
在xml bean中可以规定的init-method及destory-method在@Bean的配置形式中有相应的
版本,即@Bean(initMethod = "*", destoryMethod = "*")
类似地有scope的相应操作,如在@Bean下加修饰@Scope("prototype")
可以将每一个返回新的bean实体。
Spring中的事件处理基本上类似于signal的意义(熟悉scrapy或者一些基于事件驱动
进行传递信息框架的人很熟悉)
如:
监听 ContextStartedEvent -> implements ApplicationListener<ContextStartedEvent>
-> Override onApplicationEvent(ContextStartedEvent event)
相应地有对ContextStoppedEvent的处理。
下面看一个实现了利用@Bean进行自动配置及进行事件处理的例子。
package com.tutorialspoint;
import org.springframework.beans.factory.annotation.Value;
/**
* Created by admin on 2016/12/21.
*/
public class HelloWorld {
@Value("Hello World!")
private String message;
public void setMessage(String message)
{
this.message = message;
}
public void getMessage(){
System.out.println("Your mesage : " + message);
}
}
package com.tutorialspoint;
import org.springframework.beans.factory.annotation.Value;
/**
* Created by admin on 2016/12/21.
*/
public class HelloWorld {
@Value("Hello World!")
private String message;
public void setMessage(String message)
{
this.message = message;
}
public void getMessage(){
System.out.println("Your mesage : " + message);
}
}
package com.tutorialspoint;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStoppedEvent;
/**
* Created by admin on 2016/12/21.
*/
public class CStopEventHandler implements ApplicationListener<ContextStoppedEvent>{
public void onApplicationEvent(ContextStoppedEvent event){
System.out.println("ContextStopped Received");
}
}
package com.tutorialspoint;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStoppedEvent;
/**
* Created by admin on 2016/12/21.
*/
public class CStopEventHandler implements ApplicationListener<ContextStoppedEvent>{
public void onApplicationEvent(ContextStoppedEvent event){
System.out.println("ContextStopped Received");
}
}
package com.tutorialspoint;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStoppedEvent;
/**
* Created by admin on 2016/12/21.
*/
public class CStopEventHandler implements ApplicationListener<ContextStoppedEvent>{
public void onApplicationEvent(ContextStoppedEvent event){
System.out.println("ContextStopped Received");
}
}
下面对自定义事件展开简要介绍,
自定义事件需要定义继承org.springframework.context.ApplicationEvent
的事件类,由于基类没有提供默认构造函数,在继承时必须重载基于source
的构造函数,source参数指定了事件的publisher,一般在此publisher中
的某个函数中对此事件进行初始化,并调用此publisher的一个方法
实现事件的publish。
值得注意的是,下面例子中的publish的细节是调用一个ApplicationEventPublisher接口
的实现类相应的publishEvent函数。
(这里使用了java的一个特性,即java能够对接口及其实现类实施基类与派生类的多态
关系,基本上就是虚基类的作用)
事件处理的部分已经在前面提到了(onApplicationEvent)
下面是示例代码:
package com.tutorialspoint;
import org.springframework.context.ApplicationEvent;
/**
* Created by admin on 2016/12/21.
*/
public class CustomEvent extends ApplicationEvent {
public CustomEvent(Object source){
super(source);
}
public String toString(){
return "My Custom Event";
}
}
package com.tutorialspoint;
import org.springframework.context.ApplicationEvent;
/**
* Created by admin on 2016/12/21.
*/
public class CustomEvent extends ApplicationEvent {
public CustomEvent(Object source){
super(source);
}
public String toString(){
return "My Custom Event";
}
}
package com.tutorialspoint;
import org.springframework.context.ApplicationListener;
/**
* Created by admin on 2016/12/21.
*/
public class CustomEventHandler implements ApplicationListener<CustomEvent> {
public void onApplicationEvent(CustomEvent event){
System.out.println(event.toString());
}
}
package com.tutorialspoint;
import org.springframework.context.annotation.*;
/**
* Created by admin on 2016/12/21.
*/
@Configuration
public class TestConfigure {
@Bean
public CustomEventHandler customEventHandler(){
return new CustomEventHandler();
}
@Bean
public CustomEventPublisher customEventPublisher(){
return new CustomEventPublisher();
}
}
package com.tutorialspoint;
import org.springframework.context.annotation.*;
import org.springframework.context.ConfigurableApplicationContext;
/**
* Created by admin on 2016/12/21.
*/
public class MainApp {
public static void main(String [] args){
ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(TestConfigure.class);
CustomEventPublisher cvp = (CustomEventPublisher) context.getBean(CustomEventPublisher.class);
cvp.publish();
cvp.publish();
}
}