Spring经典总结(五)
eleteCost()
public final void $Proxy4.findById()
public final boolean $Proxy4.isFrozen()
public final org.springframework.aop.TargetSource
$Proxy4.getTargetSource()
public final void
$Proxy4.addAdvisor(int,org.springframework.aop.Advisor)
从以上结果可以看出,动态代理类中重写了原实现类中的
addCost()、deleteCost()、findById()方法并加入了方面(共同
处理的方法),这样就可以实现对目标对象实现方面切入。
9.采用AOP记录异常信息
1)编写记录异常信息的方面组件
2)指定切入点表达式,指定目标对象
3)指定异常通知,目标方法发生异常后执行方面组件
10.Log4j日志工具
log4j-1.2.11.jar
主要用于消息输出。可以控制消息输出的级别,输出方式,格式。
该工具主要有三类组件构成:
1)Logger日志器
用于将消息分成级别输出。
2)Appender输出器
用于实现消息输出的不同方式。例如控制台,文件等
3)Layout布局器
用于格式化消息内容
11.Spring注解配置
Spring注解配置的作用和在applicationContext.xml中的配置的效果是一
样的。如果开发大型程序,在applicationContext.xml中添加配置过于麻
烦。
1)组件自动扫描技术
可以自动扫描指定包下的组件,当遇到组件类定义前面有以下注解标记时,
会将该组件纳入Spring容器。等价于定义。
--首先需要在spring配置中开启组件扫描技术
--如果发现类定义前有以下注解标记
@Component :(字面意思就是组件),它在你确定不了是哪一
个层的时候使用。各个情况都可使用
@Controller : 建议在Action组件使用
@Service : 业务逻辑层,就是我们的service或者manager层。建议
在Service组件使用
@Repository : 控制层,就是我们的action层。建议在DAO组件使用
其实,这四个注解的效果都是一样的,Spring都会把它们当做需要注入的Bean加载在上下文中;但是在项目中,却建议你严格按照除Componen的其余三个注解的含义使用在项目中。这对分层结构的web架构很有好处。
上面四种标记默认将组件扫描到Spring容器,id值使用的是类名首字母小写,如果需要指定id,可以使用@Service("id值")格式定义.
可以使用@Scope注解指定scope=""属性值,使用格式
@Scope("prototype")注解,
getBean("costServiceImpl")中的”costServiceImpl”为类名
CostServiceImpl的首字母小写,也可以在类前指定
@Service("costService")
--如果两个组件之间有注入关系
可以使用@Resource或@Autowired
按类型匹配注入也可以按名称匹配注入,如果按名称匹配注入,
@Resource(name="id属性")
eg:
DAO实现类的定义:
@Repository
@Scope("prototype")
public class CostDAOImpl implements CostDAO{
............
}
如此配置后,spring便将DAO扫描进容器,id为”CostDAO”(注意:
id值是以CostDAOImpl实现的接口CostDAO的名称定义的。
Service实现类的定义(需要用到DAO实现类,即Service组件和DAO
组件之间有注入关系):
@Service("costService")
@Scope("prototype")
public class CostServiceImpl implements CostService{
@Resource
//@Autowired和@Resource既可以放在属性前也可以放在setter
方法前
private CostDAO costDao;
//public void setCostDao(CostDAO costDao){//可省略
//this.costDao = costDao;
//}
private CostDAO costDao;
public void setCostDao(CostDAO costDao){//可省略
this.costDao = costDao;
}
2)AOP注解配置
--在spring配置中开启AOP注解方式
--在方面组件中使用以下注解标记
======类定义前使用======
@Component //将组件扫描到容器
@Asepect //将组件指定为方面组件
======通知方法前使用======
@Around("切入点表达式") :环绕通知切入
@Before("切入点表达式") :前置通知切入
@AfterReturning() :后置通知切入
@AfterThrowing() : 异常通知切入
@After() : 最终通知切入
===================Spring整合==================