Spring设计模式
- - 行业应用 - ITeye博客springMVC通常采用属性注入的IOC方式和AOP织入方式相结合实现依赖注入
同时使用强制代理方式,代理类或者接口. 这里又涉及到单例模式(注入的类或者接口在容器中只存在一个)、工厂模式(通过反射实现类实例化过程的公用化)、楼上所说的装饰模式属于AOP织入的一部分. 想了解spring先从IOC和AOP开始吧.
springMVC通常采用属性注入的IOC方式和AOP织入方式相结合实现依赖注入
同时使用强制代理方式,代理类或者接口。
这里又涉及到单例模式(注入的类或者接口在容器中只存在一个)、工厂模式(通过反射实现类实例化过程的公用化)、楼上所说的装饰模式属于AOP织入的一部分。
想了解spring先从IOC和AOP开始吧。
一、单例模式案例:
一般Singleton模式通常有三种形式:
第一种形式: 也是常用的形式。
public class Singleton {
private static Singleton instance = null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
}
第二种形式:
public class Singleton {
//在自己内部定义自己的一个实例,只供内部调用
private static Singleton instance = new Singleton();
private Singleton(){
//do something
}
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance(){
return instance;
}
}
第三种形式: 双重锁的形式。
public class Singleton {
private static Singleton instance = null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(null == instance){
instance = new Singleton();
}
}
}
return instance;
}
}//这个模式将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。
二、IOC通过单例模式+工厂模式的实现
抽象类
Java代码
package com.factory;
import com.singleton.Singleton;
public abstract class AbstractFactory {
public abstract Singleton createSingleton();
}
工厂类
Java代码
package com.factory;
import com.singleton.Singleton;
public class Factory extends AbstractFactory{
@Override
public Singleton createSingleton() {
return Singleton.getInstance();
}
}
单例类
Java代码
package com.singleton;
public class Singleton {
private static Singleton instance = null;
public Singleton(){
}
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
public String testSingleton(){
return "Hello Singleton";
}
}
测试类
Java代码
package com.test;
import com.factory.Factory;
import com.singleton.Singleton;
public class Test {
public static void main(String[] args){
Factory factory = new Factory();
Singleton s = factory.createSingleton();
System.out.print(s.testSingleton());
}
}
三、代理案例
1.定义提供方法的接口
public interface IHello {
public void hello(String name);
}
2.接口实现类
public class HelloSpeaker implements IHello {
public void hello(String name) {
System. out.println("实现类中的hello():" +"Hello " + name);
}
}
3.定义静态代理类注入接口通过实现类实现方法
public class HelloProxy implements IHello {
private IHello iHello ;
public HelloProxy(IHello iHello) {
super();
this.iHello = iHello;
}
public void hello(String name) {
System. out.println("代理类中的hello():" );
iHello.hello(name);
}
}
4.静态代理类测试main方法入口
public class ProxyDemo {
public static void main(String[] args) {
IHello iHello = new HelloProxy(new HelloSpeaker());
iHello. hello("long");
}
}
5.定义动态代理类减少代理类对接口的依赖
public class LogHandler implements InvocationHandler {
private Object implClass ;
public Object bind(Object implClass) {
this.implClass = implClass;
return Proxy.newProxyInstance(implClass.getClass().getClassLoader(),
implClass.getClass().getInterfaces(), this);
}
/**
* 代理对象,这里面还可以改变原有的方法
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
try {
System. out.println("添加日志" );
result = method.invoke( implClass, args);
} catch (Exception e) {
e.printStackTrace();
}
return null ;
}
}
6.动态代理类的测试主入口
public class ProxyDt {
public static void main(String[] args) {
LogHandler logHandler = new LogHandler();
IHello iHello = (IHello) logHandler.bind( new HelloSpeaker());
iHello.hello( "long");
}
}
四、利用ProxyFactory连接CGLIB简单实现AOP:
加入包aopalliance.jar\cglib-nodep-2.1_3.jar demo:
view plaincopy to clipboardprint?
package cn.partner4java.proxy.proxyfactory;
/**
* 被代理的对象
* @author partner4java
*
*/
public class MessageWriter {
public void writeMessage(){
System.out.println("world!");
}
}
package cn.partner4java.proxy.proxyfactory;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
/**
* 装饰者
* MethodInterceptor接口是对方法调用连接点实现包围通知的AOP联盟标准接口
* @author partner4java
*
*/
public class MessageDecorator implements MethodInterceptor{
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.print("Hello ");
Object retVal = invocation.proceed();
return retVal;
}
}
package cn.partner4java.proxy.proxyfactory;
import org.springframework.aop.framework.ProxyFactory;
/**
* 调用组装
* 这里最重要的部分是我们使用ProxyFactory来创建一个目标对象代理,同时织入通知
* @author partner4java
*
*/
public class HelloWorldWeaver {
public static void main(String[] args) {
//目标
MessageWriter target = new MessageWriter();
//create the proxy
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.addAdvice(new MessageDecorator());
proxyFactory.setTarget(target);
//获取返回被代理的目标
MessageWriter proxy = (MessageWriter) proxyFactory.getProxy();
target.writeMessage();
System.out.println("---");
proxy.writeMessage();
// 后台打印:
// world!
// ---
// Hello world!
}
}