Spring学习笔记(2)(二)

2014-11-24 09:24:03 · 作者: · 浏览: 1
rocessBeforeInitialization方法

和postProcessAfterInitialization方法。

publicclassMyBeanPostProcessorimplements BeanPostProcessor{

@Override//该方法会在每个Bean创建好之后执行,执行完接着执行postProcessAfterInitialization方法

public ObjectpostProcessBeforeInitialization(Object bean, String beanName)throws BeansException {

System.out.println("处理Bean前...");

return bean;//处理完后要返回原来的bean

}

@Override

public ObjectpostProcessAfterInitialization(Object bean, String beanName)throws BeansException {

System.out.println("处理Bean后...");

return bean;//处理完后要返回原来的bean

}

}

2) 在配置文件注册该类。

4.4使用Spring来加载配置文件

说明:使用了context:property-placeholder后,Spring可以是根据${xxx}可以的内容到xxx.properties文件中找对应的值并设置到value上。

5. 工厂Bean(FactoryBean)
FactoyBean(接口)是一个专用于生产其它类型业务组件的Bean,用于生产其它产品的Bean。

注意:FactoyBean和BeanFactoy是两个完全不同的接口。前者专门用来生产Bean,后者专门用来获取Bean。

1) 自定义工厂Bean

自定义工厂Bean要实现FactoryBean接口。

publicclass PersonFactoryBeanimplementsFactoryBean {

@Override

public PersongetObject() throws Exception {

System.out.println("getObject..........");

//返回一个Person类型的Bean

returnnew Person("张三");

}

@Override

publicClass getObjectType() {

//返回该Bean的类型

System.out.println("getObjectType..........");

return Person.class;

}

@Override

publicboolean isSingleton() {

//该Bean是否是单例的

System.out.println("isSingleton..........");

returnfalse;

}

}

2) 在配置文件注册该类。

id="pfb"class="com.maple.spring.customtype.PersonFactoryBean"/>

6. 简化配置(p和c命名空间)
p和c命名空间是Spring3.0引入的,为了简化书写。

p:属性 property

c:构造函数 constructor

c:parent-ref=”p5”引用其他bean。

p:name="李四" p:age="23"p:parent-ref="p3"/>

c:name="王五"/>

7. 代理模式(理解AOP原理的基础)
7.1概念
代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式包含抽象主题,代理主题和真实主题。

7.2使用JDK创建代理类
使用JDK的Proxy类创建代理对象时,只能创建实现了某个接口的类的代理对象,没有实现接口的类是不能用JDK的Proxy类来创建代理对象的。

方式1:

/*

* 创建实现了IHello接口的类的代理对象

* 参数1:类加载器

* 参数2:接口的字节码

* 参数3:回调函数(每次调用代理对象非final修饰方法时都会执行里面的invoke方法)

*/

IHello hello = (IHello) Proxy.newProxyInstance(TestProxy.class.getClassLoader(),new Class[]{IHello.class},newInvocationHandler() {

@Override

public Object invoke(Objectproxy, Method method, Object[] args)throws Throwable {

System.out.println("执行invoke方法----" +method.getName());

returnnull;

}

});

System.out.println(hello);//null

System.out.println(hello.getClass());//class $Proxy4

hello.sayHi();//无内容

方式2:

final IHello realObject=new HelloImpl();//真实对象

//代理对象

IHellohello = (IHello) Proxy