`
haierboos
  • 浏览: 434592 次
文章分类
社区版块
存档分类
最新评论

NOTE:JAVA

 
阅读更多

2007-6-15

____________________________________________________________________________________

1.spring容器

spring容器就是IoC容器,用来实现反转控制的spring组件.spring中提供了两种IoC容器:BeanFactoryApplicationContext

ApplicationContextBeanFactory的一个子接口,它继承了BeanFactory接口,并提供一些更为强大的功能.通常情况下,建议使用

ApplicationContext.

ApplicationContext还有一个独特的能力:预加载单态类.BeanFactory中所有的类都是延迟加载(lazy load)

2.spring,如果一个对象的字段是map类型,那么这里会一个小小的约束:那是在对该map进行配线时,它的key只能是string类型

2007-6-18

____________________________________________________________________________________

1.关于setter注入和constructor注入

两种注入方法各有用特点,应该根据实际情况选择使用那一种注入方法。

一般来说:constructor注入用于注入那些不易变的类属性:比如一个DAOconstructor注入只会执行一次,一旦注入将不再改变

而且构造函数并不多时。另个构造函数注入将使得类不易被继承,因为其子类在继承它时必须使用其父类的构造方法。

setter注入更加灵活,可以用来注入那些常常变动的(mutable)属性,但是这也可能导致一个属性被多次反复注入同一值的问题.

总之如何在setter注入和constructor注入选择要根据实际情况来确定.

2007-6-20

__________________________________________________________________________________________-

1.Most aspects are a combination of advice that defines the

aspect’s behavior and a pointcut defining where the aspect should be executed.

Spring recognizes this and offers advisors, which combine advice and pointcuts

into one object. More specifically, the PointcutAdvisor does this.

public interface PointcutAdvisor {

Pointcut getPointcut();

Advice getAdvice();

}

2.Spring使用术语advisor来 表示代表方面的对象,它包含一个通知和一个指定特定连接点的切入点。

Spring中,一个advisor就是一个aspect的完整的模块化表示。一般地,一个advisor包括通知和切入点。

org.springframework.aop.support.DefaultPointcutAdvisor 是最通用的advisor类它可以和MethodInterceptor BeforeAdvice或者ThrowsAdvice一起使 用

查看springaopalliance包可以看到:interceptor继承自advice说明:拦截器也是一种通知.

就像AfterReturningAdvice,MethodBeforeAdvice一样.

3.AOP适用范围

我们说AOP适用于具有[横切]性质的系统级服务.比如:权限验证,事务处理,日志书写或审计等工作.这些工作的特点就是

在业务逻辑层,我们执行很多操作都会涉及到这些操作,比如要执行某个操作,你必须先要确定当前用户是否具有执行该操作

的权限,同时,这个操作应该做为一个事务进行事务的声明和最后的提交,然后,你还得把相关的日志记录下来,我们,几乎

日绝大多数的操作都需要这些操作,那么这就是它们的所谓"横切"特性的由来(这是相对于系统层次结构的"纵切"特性而言的)

AOP中,我们把分散于程序各个部分,解决同样问题的代码片段,称为问题的切面(或方面)

2007-6-21

______________________________________________________________________________________________

1.关于spring2.0 AOP的配置问题:

spring2.0:AOP的配置提供了三种方法:一种是在spring1.2之前就使用的唯一一种配制方式,使用spring提供的

AOP特定API,并使用java的代理机制实现运行时织入一种方式,这种方式无论是是从理解上还是从使用上都很复杂和繁琐,

而它的一个最大的问题在它将依赖于springAPI.

第二种方法是使用:JAVA5注解完成(需要JAVA5AspactJ的支持)

第三种方法是使用基于Schema的配置文件配置Spring AOP(需要).

以方法二和三都需要使用到AspectJaspectjweaver.jar来帮助解析切入点相关表达式.但是它们最大的优势在于不涉及

任何springAPI.

目前我个人倾向于使用第三种方法,对于基于Schema的配置文件配置Spring AOP需要注意的几点包括:

1.要在配制文件的Beans标签中加入对AOP标签的支持即加入如下语句:

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"

2.使用AspectJ的切入点表达式来描述切入点,通过的格式如下:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

有“?”号的部分表示可省略的,modifers-pattern表示修饰符如publicprotected等,ret-type-pattern表示方法返回类型,declaring-type-pattern代表特定的类,name-pattern代表方法名称,param-pattern表示参数,throws-pattern表示抛出的异常。在切入点表达式中,可以使用*来代表任意字符,用..来表示任意个参数。

比如前面的示例中,execution(* springroad.demo.chap5.exampleB.Component.business*(..))就是一个基于AspectJ的切入点表达式。匹配springroad.demo.chap5.exampleB.Component类中以business开头,返回值为任意类型的方法。

修正一下:刚才看到spring2.0的手册,里面对第二种和第三种AOP声明风格做了详细比较,最后的结论是:@AspactJ风格的声明具有更大的优势,

并建议使用此方式!

2007-7-3

____________________________________________________________________________________________________________________

1.区分BeanFactoryFactoryBean

BeanFactory就不用多说了,但是这个FactoryBean就很有意思了.

spring中一共有两种bean:普通的bean和工厂bean(也就是FactoryBean,用来生产beanbean.)

FactoryBean是一个接口,它主要有三个方法:getObject(),getObjectType(),isSinglet()

要特别说明的是当我们使用BeanFactory来获得一个FactoryBean时有两种情况:

首先假设我们有一个FactoryBean名为地Fb,这个Bean专门用来得到一种Bean,这里假设是Date类型对象吧

现在如果我们使用BeanFactorygetBean("fb");那么我们得到的是一个表示当前时间的Date对象

而如果我们这样使用getBean("&fb"),那么我们得到才是一个Fb.

2007-7-4

_____________________________________________________________________________________________________________________

1.今天突然间想起了使用Srping API进行AOP配置中关于那段配置代理后,在程序中使用ApplicationContext获取需要加入切面的对象的

一段代码.就是下面的一段:

<beans>

<bean id="targetBean"

class="springroad.demo.chap5.exampleB.ComponentImpl">

</bean>

<bean id="adviceBean"

class="springroad.demo.chap5.exampleB.AdviceBean">

</bean>

<bean id="pointcutBean"

class="org.springframework.aop.support.NameMatchMethodPointcut">

<property name="mappedName" value="business*"></property>

</bean>

<bean id="aspectBean"

class="org.springframework.aop.support.DefaultPointcutAdvisor">

<property name="advice" ref="adviceBean"></property>

<property name="pointcut" ref="pointcutBean"></property>

</bean>

<bean id="component"

class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="target" ref="targetBean"></property>

<property name="interceptorNames">

<list>

<value>aspectBean</value>

</list>

</property>

</bean>

</beans>

具体得到一个已经做好代理的目标对象的方法是:

ApplicationContext context=new org.springframework.context.support.ClassPathXmlApplicationContext("*.xml");

Component component=(Component)context.getBean("component");

我之前的疑问是context.getBean得到的分明是一个ProxyFactoryBean类型,它怎么能转换成Component类型呢?

想到昨天讲到的FactoryBean我终于明白了这其中的道理:就像昨天说的一样,由于component是一个ProxyFactoryBean类型

所以当我们使用context.getBean("component")时得到的是又调用了componentgetObject()方法而得到的它的代理对象,

并不是component代理本身,只有我们这样写context.getBean("&component"),得到的才是一个ProxyFactoryBean类型的对象.

23/06/2008

_____________________________________________________________________________________

1.关于@Autowired@Resource:

If you intend to express annotation-driven injection by name, do not primarily use @Autowired -

even if is technically capable of referring to a bean name through @Qualifier values. Instead,

prefer the JSR-250 @Resource annotation which is semantically defined to identify a specific target

component by its unique name, with the declared type being irrelevant for the matching process.

As a specific consequence of this semantic difference, beans which are themselves defined as a

collection or map type cannot be injected via @Autowired since type matching is not properly

注意:@Autowired是基于类型进行匹配的,虽然通过@Qualifier也是可匹配到具体的某个bean,但是这不是合理的使用方法,如果想基于名称进行查找,从而精确匹配到某个bean,应使用@Resource

applicable to them. Use @Resource for such beans, referring to the specific collection/map bean by

unique name.

再补充一点:@Qualifier要配合@Autowired使用,虽然能过给@Qualifier设置beanID,可能保证按名称进行配线,但是这是不是@Qualifier设计意图。@Qualifier依然是基于类型进行匹配的,它的作用是通过添加限定条件来缩小@Autowired匹配的范围!

2.关于Joinpoint Pointcut

初接触AOP时,往往搞不懂这两个概念,一旦明白了才发现真是很简单的概念。

首先看Pointcut,其时这一个再简单不过的概念了,只是名子“古怪”,让人搞不明白。其时Pointcut就是指那些程序进行过程中的一些“点”或者说“时刻”,比如说一个方法的执行,一个字段改变(在Spring中,PointCut只能是一个方法的执行,也就是说Spring只能拦截方法的调用。)。这些点跟AOP没什么关系,但是从AOP的角度去观察,这些“点”却是可以被“拦截”的对象!而在一个程序里joinpoint到处都是,要拦截那些joinpoint就是Pointcut的工作了。简言之,Pointcut就是一组joinpoint的集合。因此说pointcutjoinpoint之间是一对多的关系。

24/06/2008

1.关于@Qualifierfallback规则。

@Qualifier用于同@AutoWire配合缩小基于类型匹配时的获选范围。如果IOC中没有声明@Quaulifier指定的限定符时,Spring会回退到将beanID作为限定符进行匹配。记住,如果此时再匹配不到,Spring是不会回退到基于类型的匹配上(这个@Quaulifier的初衷已经背道而驰了!)此是会抛出异常!@Resource才是先基于名称进行匹配,如果没有才回退到基于类型上来。

26/06/2008

Spring包结构以及各个包之间引用关系说明关键字: Spring Spring 包结构说明:spring.jar

--------------------------------------------------------------------------------

包含有完整发布的单个jar包。他包含有除spring-mock.jar之外的所有jar。原因是,spring-mock.jar只有在开发环境中才会用到,而且仅仅是作为一个辅助测试类存在。除了spring.jarspring还包括13个独立的jar文件,他们各自包含这spring各自的组件。所以,如果你可以明确知道使用spring的哪些资源文件时,就没必要去直接引入spring.jar,但有时候spring.jar的引入也是最偷懒和最直接的方式。spring-core.jar

--------------------------------------------------------------------------------

这个jar包含spring框架基本的核心工具类,spring其他组件都要使用到这个包里的类。是其他组件的基本核心。spring-beans.jar

--------------------------------------------------------------------------------

这个jar是所有应用都要用到的,他包含访问配置文件,创建和管理bean以及进行Inversion of Control / Dependency InjectionIoC/DI)操作相关的所有类如果应用只需基本的IoC/DI支持,引入spring-core.jarspring-beans.jar就已经足够了。spring-aop.jar

--------------------------------------------------------------------------------

包含一些使用AOP特性时需要用到的一些类。在使用spring AOP特性如Declarative Transaction Management(事务管理)就需要用到这个jar文件。

spring-context.jar

--------------------------------------------------------------------------------

这个jar文件为spring提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类。JNDI所需的全部类,用来跟模板引擎集成(VelocityFreeMarkerJasperReports)的类,以及校验相关类。

spring-dao.jar

--------------------------------------------------------------------------------

包含Spring DAOSpring Transaction进行数据访问的所有类,为了使用声明性事务支持还需要在自己的应用里包含spring-aop.jarspring-hibernate.jar

--------------------------------------------------------------------------------

是对Hibernate支持的所有类。

spring-orm.jar

--------------------------------------------------------------------------------

jarspring DAO特性集合进行了扩展,使其支持iBATISJDOOJBTopLink,由于springhibernate独立成包了,因此在这里没有在支持hibernate。这个文件里大部分的类都依赖spring-dao.jar中的类。spring-remoting.jar

--------------------------------------------------------------------------------

这个包提供对EJBJMS以及远程调用(RMIHessianBurlapHttp Invoker JAX-RPC)相关的类spring-support.jar

--------------------------------------------------------------------------------

该组件提供对Cacheehcache)、JCAJMX,邮件服务(Java MailCOS Mail),计划任务SchedulingTimerQuartz)支持的类spring-web.jar

--------------------------------------------------------------------------------

如果web开发中开发,而且用到用到spring框架,那就应该引入这个包,该组件包括WebApplicationContext特性的类、strutsJSF集成类、文件上传的支持类、Filter类和大量工具辅助类。

spring-webmvc.jar

--------------------------------------------------------------------------------

该组件包含Spring MVC框架相关的所有类,包含国际化、标签、Theme、视图展现的FreeMarkerJasperReportsTilesVelocityXSLT相关类。如果使用了独立的MVC框架则该组件不再需要。

spring-mock.jar

--------------------------------------------------------------------------------

这个文件中包含Spring一整套mock类来辅助应用的测试。spring测试套件使用了大量的mock类,这样测试就更加简单了。由于可以对HttpServletRequestHttpServletResponse进行模拟,使得对web进行单元测试更加方便。包间引用关系:Spring中各个包引入之前都需要保证引入 commons-logging.jar

spring-core.jar commons-collections.jarspring-core.jar 是以下其他各个组件的基础。

spring-beans.jar spring-core.jar/cglib-nodep-2.1_3.jar

spring-aop.jar spring-core.jar/spring-beans.jar/cglib-nodep-2.1_3.jar/aopalliance.jar

spring-context.jar spring-core.jar/spring-beans.jar/spring-aop.jar/commons-collections.jar/aopalliance.jar

spring-dao.jar spring-core.jar/spring-beans.jar/spring-aop.jar/spring-context.jar

spring-jdbc.jar spring-core.jar/spring-beans.jar/spring-dao.jar

spring-web.jar spring-core.jar/spring-beans.jar/spring-context.jar

spring-webmvc.jar spring-core.jar/spring-beans.jar/spring-context.jar/spring-web.jar

spring-hibernate.jar spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-jdbc.jar/spring-orm.jar/spring-web.jar/spring-webmvc.jar

spring-orm.jar spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-jdbc.jar/spring-web.jar/spring-webmvc.jar

spring-remoting.jar spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-context.jar/spring-web.jar/spring-webmvc.jar

spring-support.jar spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-context.jar/spring-jdbc.jar

spring-mock.jar spring-core.jar/spring-beans.jar/spring-dao.jar/spring-context.jar/spring-jdbc.jar

2009-12-22

关于Spring的基于Proxy的AOP实现:

我们知道,在Spring中,默认的AOP实现方式是通过代理(JDK的动态代理和CGLIB),既然是基于代理,这里就有些“特殊”情况是代理做不到的:

对Protected/Private方法和构造方法无法拦截,对内部被调用的方法无法拦截!如果对上面的情况进行拦截,需要使用spring的native AspectJ weaving。

关于AOP实现方式的选择:

有两种方式可供选择:使用Spring的基于代理的AOP实现和使用AspectJ

显然,方式一的问题是:它只能拦截SpringIOC窗口里的Bean,像Domain Object就无法拦截!这时只能使用AspectJ.一个例子就是oobbs系统中那个ThreadPublishService,这个服务要拦截领域对象Thread的addPost方法,进而向订阅用户发送消息。这里,被拦截对象Thread不在Spring管理范围内!此时,只能通过AspectJ来实现了。

jdbc.jar

jdbc.jarjdbc.jar

2009-12-22

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics