Spring顾问、IOC注解和注解增强

一、顾问

通知的一种表现方式(顾问包装通知/增强)

Advisor:
  名称匹配方法:
    NameMecthMethodPointcutAdvisor

    1.定义了一个业务类

package cn.spring.advisor;
/**
 * 业务接口
 */
public interface IService {
    //业务方法
    public void doSome();

    public void say();
}

    2、定义里一个增强类,实现了增强接口

package cn.spring.advisor;

public class IServiceImpl implements IService{
    @Override
    public void doSome() {
        System.out.println("=============真实业务=============");
    }

    @Override
    public void say() {
        System.out.println("=============say=============");
    }
}

    3.applicationContext.xml

        将业务类和增强类注入到Spring容器当中

    <!--注入业务Bean-->
    <bean id="iServiceImpl" class="cn.spring.advisor.IServiceImpl"></bean>
    <!--切面/通知-->
    <bean id="myAdvisor" class="cn.spring.advisor.MyAdvisor"></bean>

        利用顾问包装增强

<bean id="advisor" class="org.springframwork.aop.support.NameMecthMethodPointcutAdvisor">
<property name="advice" ref="MyAdvisor"/>
<property name="mapperNames" value="*do*"/></bean>

        利用代理工程生成代理对象 

<bean id="proxyFactory" class="ProxyFactoryBean">
    <property name="in" value="advisor"/>
    <property name="target" ref="IService"/>
</bean>

  顾问自动代理:
    默认顾问自动代理

      applicationContext.xml

1.定义了一个业务类
2.定义了一个增强类 实现 增强接口
3.applicationContext.xml
3.1将业务类和增强类注入到Spring容器当中
3.2利用顾问包装增强
<bean id="advisor" class="org.springframwork.aop.support.RegrexMethodPointcutAdvisor">
<property name="advice" ref="MyAdvisor"/>
<property name="pattens" value=".*do.*"/>
</bean>
3.3顾问自动代理
<bean class="DefaultAdvisorAutoProxyCreator"/>

BeanName顾问自动代理

1.定义了一个业务类
2.定义了一个增强类 实现    增强接口
3.applicationContext.xml
    3.1将业务类和增强类注入到Spring容器当中
    3.2利用顾问包装增强
<bean id="advisor" class="org.springframwork.aop.support.RegrexMethodPointcutAdvisor">
    <property name="advice" ref="MyAdvisor"/>
    <property name="pattens" value=".*do.*"/>
</bean>
    3.3顾问自动代理
<bean class="BeanNameAutoProxyCreator">
    <property name="beanNames" value="iService"/>
    <property name="Inters" value="advisor"/>
</bean>

二.IOC注解
  IOC注解需要需要在大配置文件中,扫描包 <context:compoent-scan base-package="cn.spring"/>
  注入:向Spring容器注入Bean的
    @Compoent 实现业务Bean的注入
    @Repository 专门注入Dao 基于@Compoent
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component
    public @interface Repository {

    /**
    * The value may indicate a suggestion for a logical component name,
    * to be turned into a Spring bean in case of an autodetected component.
    * @return the suggested component name, if any (or empty String otherwise)
    */
    @AliasFor(annotation = Component.class)
    String value() default "";

    }
    @Service 专门注入Service
    @Controller 专门定位控制层

    定位:
    @Resource 默认根据Bean名称定位,如果名称为空,则根据Type定位
    @Autowired 默认根据ByType注入 一旦出现多个兼容类型的,那么我们需要根据名称区分@Qualifier

案例:

  Dao层接口

public interface IUserInfoMapper {
    public int addUser(UserInfo info);
}

  IUserInfoMapperImpl类实现了Dao接口

@Repository
public class IUserInfoMapperImpl implements IUserInfoMapper {

    @Override
    public int addUser(UserInfo info) {
        System.out.println("添加成功");
        return 1;
    }
}

  IUserInfoService接口

public interface IUserInfoService {
    public int addUser(UserInfo info);
}

  IUserInfoServiceImpl类实现了IUserInfoService接口

/**
 * @Service代表Service实现类的 标识,要让Spring管理Service
 */
@Service("iUserInfoServiceImpl")
public class IUserInfoServiceImpl implements IUserInfoService{

    //植入Dao层
    //@Resource默认是根据ByName的方式,但是一旦名字为空,就根据ByType
    @Autowired
    private IUserInfoMapper iUserInfoMapper;

    @Override
    public int addUser(UserInfo info) {
        return iUserInfoMapper.addUser(info);
    }
}

  applicationContext.xml

<!--扫描注解:包扫描器-->
    <context:component-scan base-package="cn.spring"/>

三、注解增强

  业务类

package cn.spring.aop;

import org.springframework.stereotype.Service;

/**
 * 业务类
 */
@Service("IdoSomeService")
public class IdoSomeService {
    public void doSome(){
        System.out.println("业务当中的doSome方法");
    }

    public void say(){
        System.out.println("业务当中的say方法");
    }
}

  增强类

package cn.spring.aop;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 增强类
 */
@Aspect
@Component
public class MyAdvice {

    //定义一个空方法,为了可以应用切点表达式
    @Pointcut("execution(* *..aop.*.do*(..))")
    public void pointCut(){

    }

    //自定义增强方法
    @Before("pointCut()")
    public void before(){
        System.out.println("=================前置增强===================");
    }

    //自定义方法增强
    @AfterReturning("pointCut()")
    public void after(){
        System.out.println("===============后置增强==============");
    }
}

  applicationContext.xml

<!--开启AOP注解支持-->
<aop:aspectj-autoproxy/>

  Test测试类

public class AopTest {
    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        IdoSomeService bea=(IdoSomeService)ctx.getBean("IdoSomeService");
        bea.doSome();
    }
}

   

原文地址:https://www.cnblogs.com/dabrk/p/11775698.html

时间: 2024-11-16 19:27:30

Spring顾问、IOC注解和注解增强的相关文章

【Spring】IOC之基于注解的配置bean(下)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.@Autowired注解 Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量.方法及构造函数进行标注,完成自动装配的工作. 通过 @Autowired的使用来消除 set ,get方法.Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 Aut

仿spring的ioc实现之注解注入的小例子

首先,我们先写出一个自定义的注解 <span style="font-size:14px;">package com.test.aonntion; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 生

【Spring】IOC之基于注解的配置bean

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.基于注解的配置 Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这3 个注

Spring框架——关于IOC容器和注解的36个小实验

实验1:通过IOC容器创建对象,并为属性赋值★ <bean id="page" class="com.neuedu.Bean.Page"> <property name="fontSize" value="大写"></property> <property name="fontNum" value="12"></property>

spring 的IoC注解的配置信息

Spring的注解Ioc的配置 注解一共分为四类: 1.创建对象 2.注入数据 3.改变作用范围 4.和生命周期相关 1.创建对象 xml方式创建对象 相对于xml配置就是:<bean id=" " class=" "></bean> id 为要创建对象的唯一标识 class 对象的全限定类名 注解创建创建对象 @component() 组件的意思 作用:把当前类的对象存入IoC容器中(写在要创建的对象的类上面) 参数: value 指定获取

七 Spring的IOC的注解方式

Spring的IOC的注解方式入门 创建web项目,引入相应的jar包 除了IOC的6个包,还需要AOP的包 引入Spring配置文件 创建applicationContext.xml 引入约束:使用注解开发引入context约束 file:///D:/Hibernate/Spring/spring-framework-4.2.4.RELEASE/docs/spring-framework-reference/html/xsd-configuration.html 创建接口和实现类: 配置Spr

Spring的IOC注解开发入门2

注解方式设置属性的值 在我们IOC基于xml属性注入的方式中有(一般推荐set方法) 构造方法注入普通值:<constructor-arg>的使用 set方法注入普通值:<property>的使用   注入对象值:ref的使用 SPEL方式注入普通值与对象值 #{SPEL} P名称空间方式注入普通值与对象值 在我们IOC基于注解方式开发中 普通属性:Value 对象属性:AutoWired :设置对象类型的属性的值,按照类型注入.习惯是按照名称完成属性注入,那么和以下注解配合使用@

谈谈Spring的IoC之注解扫描

问题 ??IoC是Inversion of Control的缩写,翻译过来即"控制反转".IoC可以说是Spring的灵魂,想要读懂Spring,必先读懂IoC.不过有时候硬着头皮直接看源码,就像雾里看花,并不能一窥真谛.想要理解Spring的IoC,不如反过来思考一下,如果我们自己去实现IoC,需要考虑什么?遵循依赖大于配置的原则,我们这里只讨论注解式的控制反转容器,XML配置的方式暂不考虑.由此我想到下面几个问题: 注解扫描 实例化 循环依赖 泛型注入 本文的重点,就是围绕这几个问

spring学习3:spring ioc的纯注解配置

spring ioc的纯注解配置 一.分析 在上一篇博客中实现了xml+注解的ioc使用,我们发现,之所以离不开xml配置文件的原因是在该文件中有一句很关键的话,告知spring在创建容器时要扫描的包,依据扫描到的注解创建对象并放入容器中. <!-- 开启注解扫描,告知spring在创建容器时要扫描的包 --> <context:component-scan base-package="com.lyy.service"> </context:compone

spring的bean管理(注解方式)

1.Spring的Bean管理的中常用的注解 @Component:组件.(作用在类上) public interface UserDao {     public void sayHello(); }   @Component(value="userDao")     public class UserDaoImpl implements UserDao {   @Override public void sayHello() {     System.out.println(&qu