springDI与Aop动态代理

springDI与Aop动态代理
 

通过注解往成员变量注入值

@Resource(name="userDaoID")

其中nameXML配置中该类的id属性值

<bean id=" userDaoID "class="testspring3.IxxService">

使用@Resource需要在XML文件中配置<context:annotation-config/>标签,

springIOC容器能知道@Resource(name="userDaoID")这句话的含义.

private IUserDao userDao;//接口类型的接口实现类

  

   /**

    * springIOC容器,去查找一个名为"userDaoID"的类,

    * 查到后,通过setIUserDao()方法,传入对应的实现类

    */

   @Resource(name="userDaoID")

   public void setIUserDao(IUserDao userDao) {

      this.userDao = userDao;

      System.out.println();

   }

 

Xml配置:

<!-- 注册UserDao -->

<bean id="userDaoID"class="cn.itcast.javaee.spring.di.annotation.type2.UserDao"/>

 

<!-- springIOC容器能知道@Resource(name="userDaoID")这句话的含义 -->

   <context:annotation-config/>

 

注解代替XML注册

在原需要在XML中注册的类前面加@Component,其中的value相当与在xml中注册的id属性,这样配置还需要在XML文件中声明,springIOC去识别注解.

例如

@Component(value="userDaoID")

public class UserDao implements IUserDao {

  

   public void add() {

      System.out.println("增加用户中。。。");

   }

}

 

@Component(value="userServiceID")

public class UserService {

   private IUserDao iUserDao;

   /**

    * springIOC容器,去查找一个名为"userDaoID"的类,

    * 查到后,通过setIUserDao()方法,传入对应的实现类

    */

   @Resource(name="userDaoID")

   public void setIUserDao(IUserDao userDao) {

      iUserDao = userDao;

      System.out.println("public void setIUserDao(IUserDao userDao)");

   }

   /**

    * 增加用户

    */

   public void add(){

      iUserDao.add();

   }

}

 

 

Xml中的配置

<?xml version="1.0" encoding="UTF-8"?>

 

<beans

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

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

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

       xsi:schemaLocation="

      

             http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

           

            http://www.springframework.org/schema/context

           http://www.springframework.org/schema/context/spring-context-3.0.xsd

           

            ">

    <!-- springIOC容器去扫描指定包下面的带有@Component(value="userServiceID")的类,同时注册到springIOC容器中 -->

   <context:component-scan base-package="cn.itcast.javaee.spring.di.annotation.type3"/>

     

   <!-- springIOC容器能知道@Resource(name="userDaoID")这句话的含义 -->

   <context:annotation-config/>

  

 

</beans>           

 

 

 

 

往非基本类型注入值

<?xml version="1.0" encoding="UTF-8"?>

 

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation=

             "http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

  

   <!-- 注册Tel -->

   <bean id="tel1"class="cn.itcast.javaee.spring.di.xml.set.Tel">

       <property name="num" value="131"/>

       <property name="loc" value="广州"/>

   </bean>

   <bean id="tel2"class="cn.itcast.javaee.spring.di.xml.set.Tel">

       <property name="num" value="132"/>

       <property name="loc" value="中山"/>

   </bean>

  

  

   <!-- 注册City -->

   <bean id="city1"class="cn.itcast.javaee.spring.di.xml.set.City">

       <property name="name" value="广州"/>

   </bean>

   <bean id="city2"class="cn.itcast.javaee.spring.di.xml.set.City">

       <property name="name" value="中山"/>

   </bean>

  

  

   <!-- 注册CustomerB -->

   <bean id="customerB"class="cn.itcast.javaee.spring.di.xml.set.CustomerB">

      <property name="telSet">

         <set>

            <ref bean="tel1"/>

            <ref bean="tel2"/>

         </set>

      </property>

      <property name="cityList">

         <list>

            <ref bean="city1"/>

            <ref bean="city2"/>

         </list>

      </property>

      <property name="telCityMap">

         <map>

            <entry key-ref="tel1">

                <ref bean="city1"/>

            </entry>

            <entry key-ref="tel2">

                <ref bean="city2"/>

            </entry>       

         </map>

      </property>

   </bean>

          

</beans>          

 

往基本类型中注入值

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation=

             "http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

  

   <!-- 注册Date -->

   <bean id="date" class="java.util.Date"/>

  

   <!-- 注册CustomerA -->

   <bean id="customerA"class="cn.itcast.javaee.spring.di.xml.set.CustomerA">

     

      <!-- property标签表示set注入

          name表示JavaBean的属性值,必须提供的set方法,例如属性名为name,那么方法为setName()

          value表示注入的是基本类型值,包含对应的包装类型,例如:intInteger是等价的

       --> 

      <property name="id" value="2014"/>

      <property name="name" value="哈哈"/>

      <property name="salary" value="5000"/>

     

      <!-- ref表示注入非基本类型值 -->

      <property name="birthday" ref="date"/>

     

      <!-- 装配Set/List/Map集合 -->

      <property name="telSet">

         <set>

            <value>131</value>

            <value>132</value>

            <value>133</value>

         </set>

      </property>

      <property name="cityList">

         <list>

            <value>北京</value>

            <value>上海</value>

            <value>广州</value>

         </list>

      </property>

      <property name="telCityMap">

         <map>

            <entry key="131">

                <value>北京</value>

            </entry>

            <entry key="132">

                <value>上海</value>

            </entry>

            <entry key="133">

                <value>广州</value>

            </entry>       

         </map>

      </property>

 

      <!-- 装配Properties -->

      <property name="like">

         <props>

            <prop key="sing">唱歌</prop>

            <prop key="dance">跳舞</prop>

         </props>

      </property>

     

      <!-- 装配NULL -->

      <property name="school">

         <null/>

      </property>

     

   </bean>

  

          

</beans>          

 

 

 

通过构造器注入值

需要提供有参构造,

 

public class Customer {

   private Integer id;

   private String name;

   private String gender;

   private Double salary;

   /**

    * @param name   index=0

    * @param id     index=1

    * @param gender index=2

    * @param salary index=3

    */

   public Customer(String name, Integer id, String gender, Double salary) {

      this.id = id;

      this.name = name;

      this.gender = gender;

      this.salary = salary;

      System.out.println("public Customer(Integer id, String name, String gender, Double salary)");

   }

   @Override

   public String toString() {

      String str = "编号:" + id + "\n" + "姓名:" + name + "\n" +"性别:" + gender + "\n" + "薪水:" + salary + "\n";

      return str;

   }

}

XML配置

方式一:

<!-- 通过构造器传入属性值

   <bean id="customer" class="cn.itcast.javaee.spring.di.xml.constructor.Customer">

      <constructor-arg>

         <value>2014</value>

      </constructor-arg>

      <constructor-arg>

         <value>哈哈</value>

      </constructor-arg>

      <constructor-arg>

         <value></value>

      </constructor-arg>

      <constructor-arg>

         <value>5000</value>

      </constructor-arg>

   </bean>

   -->

 

方式二(角标对应有参构造参数位置):

   <bean id="customer"class="cn.itcast.javaee.spring.di.xml.constructor.Customer">

      <constructor-arg index="2">

         <value></value>

      </constructor-arg>

      <constructor-arg index="3">

         <value>6000</value>

      </constructor-arg>

      <constructor-arg index="1">

         <value>2015</value>

      </constructor-arg>

      <constructor-arg index="0">

         <value>嘻嘻</value>

      </constructor-arg>

     

   </bean>

 

 

 

方式三(传统方式,需要通过类中有setXxx方法来注入值,上面案例缺少set方法)

<bean id="customer"class="cn.itcast.javaee.spring.di.xml.constructor.Customer">

      <property name="name" value="小明"/>

      <property name="gender" value=""/>

         .....

    </bean> 

 

 

springAOP动态代理

为什么要使用动态代理?

1.使用动态代理技术,将【业务代码】与【服务代理】编程时分离,运行时结合的思想

2. 目标对象的某些功能不满足业务需要,在不破坏目标对象的功能前提下增强其功能

 

 

 

 

3.开发springAOP流程

 

 

XML配置方式

1.定义一个切面,切面就是有增强方法的类,比如在添加方法中加入显示时间,那么显示时间就是这个类的增强方法,也叫做切点.

 

/**

 * 增强类:切面

 */

public class Max1 {

      

       //增强的方法(切点),记录时间

       public void logTime(){

              DateFormat df=DateFormat.getDateTimeInstance(DateFormat.FULL,

                            DateFormat.DEFAULT,Locale.CHINA);

              String str=df.format(new Date());

           System.out.println(str);

       }

}

 

2.定义一个目标对象,这个目标对象的方法不能满足要求,需要在不改变这个类的前提下增强他的

Add()方法,在调用add()方法的时候同时显示时间.

 

/**

 * 目标对象:需要增强的对象

 */

public class UserDao {

      

       //连接点,目标对象的所有方法叫做连接点,

       public void add(){

              System.out.println("添加用户");

       }

       //连接点

       public void delete(){

              System.out.println("删除用户");

       }

}

 

 

       3.Xml配置(重点)

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"

 

   xsi:schemaLocation="

      

             http://www.springframework.org/schema/beans

            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

      

             http://www.springframework.org/schema/aop

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

           

       ">

 

   <!-- 注册切面 -->

   <bean id="max1" class="springAOP.Max1" />

   <!-- 注册目标对象 -->

   <bean id="userdao" class="springAOP.UserDao" />

  

  

   <!-- 配置springAOP,产生目标对象的代理对象 -->

   <aop:config>

     

     

      <!-- 配置符切入点条件

           id表示切入点条件唯一编号

           expression表示切入点条件,需要增强的方法

       -->

      <aop:pointcut expression="execution(* add(..))" id="XXX"/>

  

        

      <!-- 将切面切入进切入点的位置

           ref表示切面的编号

       -->

       <aop:aspect ref="max1">

         

         

          <!-- Max1切面的logTime方法增强切入到add()方法之前

              method表示切面的增强方法

              pointcut-ref表示切入点条件唯一编号

          -->

          <!-- 此处有几个方法, before,after等等几个方法,表示增强的方法在目标方法之前执行或者之后执行,根据需求使用

          <aop:before method="logTime" pointcut-ref="XXX"/> 在目标方法执行之前执行

          <aop:after method="logTime" pointcut-ref="XXX"/>在目标方法执行完后才执行

          <aop:after-returning method="logTime" pointcut-ref="XXX"/>在目标方法正常执行返回后执行(无返回值的方法也会执行)

          <aop:after-throwing method="logTime" pointcut-ref="XXX"/>在目标方法抛出异常后执行

           -->

         

          <aop:after-returning method="logTime" pointcut-ref="XXX"/>

      

       </aop:aspect>

  

   </aop:config>

 

</beans>

       4.测试类

public class tsetdao {

 

       public static void main(String[] args) {

             

       ApplicationContext ac=

              new ClassPathXmlApplicationContext(new String[]{"/springAOP/spring.xml"});

             

              UserDao u = (UserDao) ac.getBean("userdao");

              u.add();

       }

}

 

 

 

注解配置方式

 

1.       增强类(切面)

/**

 * 增强类:切面

 */

@Aspect

public class Max1 {

   

    //增强的方法(切点),记录时间

    @Before(value="execution(* add(..))")

    public void logTime(){

           DateFormat df=DateFormat.getDateTimeInstance(DateFormat.FULL,

                         DateFormat.DEFAULT,Locale.CHINA);

           String str=df.format(new Date());

        System.out.println(str);

    }

}

 

2.       目标类(需要增强)

/**

 * 目标对象:需要增强的对象

 */

public class UserDao {

   

    //连接点,目标对象的所有方法叫做连接点

    @Pointcut(value="execution(* add(..))")

    public void add(){

           System.out.println("添加用户");

    }

    //连接点

    public void delete(){

           System.out.println("删除用户");

    }

}

 

3.       XML配置

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"

 

    xsi:schemaLocation="

      

                   http://www.springframework.org/schema/beans

            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

      

                  http://www.springframework.org/schema/aop

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

           

       ">

 

    <!-- 注册切面 -->

    <bean id="max1" class="springAOP2.Max1" />

    <!-- 注册目标对象 -->

    <bean id="userdao" class="springAOP2.UserDao" />

   

    <!-- 自动根据@注解创建目标对象的代理对象 -->

         <aop:aspectj-autoproxy/>

       

 

</beans>

 

 

4.       测试类

public class tsetdao {

 

    public static void main(String[] args) {

          

    ApplicationContext ac=

           new ClassPathXmlApplicationContext(new String[]{"/springAOP2/spring.xml"});

          

           UserDao u = (UserDao) ac.getBean("userdao");

           u.add();

    }

}

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值