Ioc和Aop总结

控制反转 ioc 是框架的重要特征,并非面向对象编程的专用术语。它与依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)并没有关系。

IoC最大的好处是什么?

因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拔(有点像USB接口和SCSI硬盘了)。 Spring的控制反转就是将实例化对象的权力由类交给Spring框架来执行

Dependency Injury 依赖注入。 通过IOC创建对象的时候,可以注入字符串甚至其他对象。 比如DAO就会注入session factory. 通常IOC和DI是紧密结合,一起使用的 Spring 依赖注入例子 <bean id=“User” Class=“test1.User”> <property name=“id” value=“2”/> </bean>

通常IOC和DI是紧密结合,一起使用的

Spring 依赖注入例子

<bean id=“User” Class=“test1.User”>

  <property name=“id” value=“2”/>

</bean>

依赖注入的方式

1.普通的数据类型注入标签

<bean id=“User” Class=“test1.User”>

  <property name=“id” value=“2”/>

</bean>

2. p空间属性注入

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

<bean id="userDao" class="dao.UserDao"/>

<bean id="userServer" class="server.UserServer“ p:dao-ref="userDao"/>

 <bean id=“user” class=“test.User” p:id=“1”/>

特点:使用属性而不是子元素的形式配置Bean的属性,从而简化了配置代码 语法: 对于直接量(基本数据类型、字符串)属性:p:属性名="属性值" 对于引用Bean的属性:p:属性名-ref="Bean的id"

3.构造注入

public User(int id){this.id=id;}

<bean id=“user” class=“test1.User”>

  <constructor-arg name="id" value="123"></constructor-arg>

</bean>

注入:

1、注入直接量(基本数据类型、字符串) 如果XML中包含特殊字符(&、<、>、”、'),就使用<![CDATA[]]>标记或把特殊字符替换为实体引用

2、引用其他Bean组件 注入Bean类型的语法:p:属性名-ref="Bean的id" 使用<ref>子元素注入:<ref bean =”userdao”>

3、注入集合类型的属性: 使用<list>、<set>、<map>、<props>标签实现

4、异常抛出增强类型: 在目标方法抛出异常时织入增强处理 <aop:after-throwing>元素:定义异常抛出增强

5、最终增强特点: 无论方法抛出异常还是正常退出,该增强都会得到执行,类似于finally <aop:after>元素:定义最终增强

环绕增强特点: 目标方法前后都可织入增强处理 功能最强大的增强处理 可获取或修改目标方法的参数、返回值,可对它进行异常处理,甚至可以决定目标方法是否执行 <aop:around>元素:定义环绕增强

使用注解定义Bean:

@Component

@Repository(用于标注DAO类)

@Service(用于标注业务类)

@Controller(用于标注控制器类)

@Autowired注解实现Bean装配,默认按类型匹配,可以使用@Qualifier指定Bean的名称

@Component(“userDao”)所有受Spring 管理组件的通用形式 public class UserDaoImpl implements UserDao{}

@Controller 控制类

@Controller

   public class UserAction extends BaseAction<User>{

@Service 业务类

  @Service("userService")

  public class UserServiceImpl implements UserService {

@Repository Dao类

  @Repository(value="userDao") public class UserDaoImpl extends BaseDaoImpl<User> {

@Autowired

   @Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。

扫描注解 <context:component-scan base-package=“service,dao”/>

使用@Resource注解实现组件装配,默认按名称匹配

AspectJ简介:

面向切面的框架,它扩展了Java语言,定义了AOP 语法,能够在编译期提供代码的织入

AspectJ 5新增的功能,使用JDK 5.0 注解技术和正规的AspectJ切点表达式语言描述切面

@After Throwing注解定义异常抛出增强

Spring在定义切面时提供了多种选择,应根据项目的具体情况做出选择:

1、如果项目采用JDK 5.0或以上版本,可以考虑使用@AspectJ注解方式,减少配置的工作量

2、如果不愿意使用注解或项目采用的JDK版本较低无法使用注解,则可以选择使用<aop:aspect>配合普通JavaBean的形式

通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。

功能:

切面: 连接点: 增强处理: 切入点: 目标对象: AOP代理: 编织/织入: 增强处理类型:

Aop的几种方式和各自的适用场合:

Spring提供了4种实现AOP的方式:

1.经典的基于代理的AOP before 前置 after-returning 返回后 after-throwing 抛出后 arround 周围 introduction 引入

2.@AspectJ注解驱动的切面 execution(* greetTo(..))的切点表达式

3.纯POJO切面 单纯声明增强类,通过aop标签使用

4.注入式AspectJ切面

猜你喜欢

转载自www.cnblogs.com/Mxmeng/p/9223864.html