AOP目的:为了解耦,可以让一组类共享相同的行为。
OOP中只能通过继承类和实现接口,来使代码的耦合度增强,且类继承只能是单继承。
Spring支持AspectJ的注解式切面编程:
1)使用@AspectJ声明是一个切面;
2)使用@After、@Before、@Arround定义建言,可直接将拦截规则(切点)作为参数;
3)其中@After、@Before、@Arround参数的拦截规则为切点,为了使切点复用,可使用@PointCut专门定义拦截规则,然后在@After、@Before、@Arround的参数中调用;
4)其中符合条件的每一个被拦截处为连接点。
Bean的Scope:
1)Singleton:一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例
2)Prototype:每次调用新建一个Bean的实例
3)Request:Web项目中,给每一个http request 新建一个Bean实例
4)Session:Web项目中,给每一个http session 新建一个Bean实例
5)GlobalSession:给每一个portal http session 新建一个Bean实例
Spring的事件:
1)自定义事件,继承ApplicationEvent;
public class DemoEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L;
private String msg;
public DemoEvent(Object source,String msg) {
super(source);
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
2)定义事件监听器,实现ApplicationListener;
@Component
public class DemoListener implements ApplicationListener<DemoEvent> {
@Override
public void onApplicationEvent(DemoEvent demoEvent) {
String msg = demoEvent.getMsg();
System.out.println("我接收到发布的消息:" + msg);
}
}
3)使用容器发布事件。
@Component
public class DemoPublisher {
@Autowired
ApplicationContext applicationContext;
public void publish(String msg){
applicationContext.publishEvent(new DemoEvent(this,msg));
}
}