代码改变世界

spring IOC、DI及AOP

2012-06-18 16:10  功夫猫  阅读(973)  评论(0)    收藏  举报

IOC 控制反转 DI依赖注入

  IOC:控制反转;简单而言就是由我们平常的new转成了使用反射来获取类的实例。

  DI和IOC的区别:
  一个重要特征是接口依赖,是把对象关系推迟到运行时去确定.


  DI是一个初始化实例的过程,分为三种1.setter based 2.constructor based 3.interface based,在spring 中就是应用前两种;但又不仅仅是初始化实例,而且是运用接口的概念去实现这种注入依赖。静态地看,只是依赖一个接口,但实际运行起来,是依赖一个实现了该接口的具体类。


  IOC就是面向接口编程的应用
  1.一个通常的做法(非面向接口编程的方法),对象A依赖对象B,B会作为A的属性,可以理解为A直接控制B;
  2.IOC的做法,对象A依赖于接口C,而不直接依赖于实现了接口C的B,也就是A不能直接控制是哪个具体实现了C的B去做相应的事情,而是由我们控制可以由哪个实现了接口    C的B去处理,也就是控制反过来了,是由B来决定了,而不是由A,实现就是面向接口编程。

第一种方法,通过配置文件完成:

  1.创建web项目,添加spring-framework-3.1.0.RC1-with-docs\spring-framework-3.1.0.RC1\dist底下所有jar包;

  2.简单的书写User,pojo,dao,daoimpl,service.serviceImpl;

  3.利用set方法,创建UserDao。 

UserServiceImpl
 1 package com.kebin.service.impl;
 2 
 3 import com.kebin.dao.UserDao;
 4 import com.kebin.pojo.User;
 5 import com.kebin.service.UserService;
 6 
 7 public class UserServiceImpl implements UserService {
 8     private UserDao userDao;
 9         
10     public void setUserDao(UserDao userDao) {
11         this.userDao = userDao;
12     }
13 
14 
15     public void addUser(User user) {
16         userDao.saveUser(user);
17     }
18 
19 }

  4.在src底下创建applicationContext_kebin.xml;

  注意:property标签对内的name="userDao",必须与UserServiceImpl中成员变量保持一致;

    id与name的区别:id是唯一的,name是自定义的,例如:name="a,b,c";

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans
 5            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 6     
7 <bean id="a" class="com.kebin.dao.impl.UserDao4MySqlImpl"></bean> 8 <bean id="b" class="com.kebin.dao.impl.UserDao4OracleImpl"></bean> 9 <bean name="userService" class="com.kebin.service.impl.UserServiceImpl"> 10 <property name="userDao" ref="b"></property> 11 </bean> 12 13 </beans>

  5.书写一个测试类T.java

1 public class T {
2 
3     public static void main(String[] args) {
4         ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext_kebin.xml");
5         UserService userService = (UserService)ac.getBean("userService");
6         userService.addUser(new User());        
7     }
8 
9 }

第二种方法,通过注解完成:

   1.见spring文档4.10.1,配置applicationContext_kebin.xml;

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"      
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans
 6            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 7            http://www.springframework.org/schema/context
 8            http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 9     
11     <context:component-scan base-package="com.kebin.*"/>            
12 </beans>

  2.注解;

UserDao4MySqlImpl.java

package com.kebin.dao.impl;

import org.springframework.stereotype.Component;

import com.kebin.dao.UserDao;
import com.kebin.pojo.User;

@Component("mysql")
public class UserDao4MySqlImpl implements UserDao {

    public void saveUser(User user) {
        System.out.println("------mysql----------");
    }
}
//UserDao4MySqlImpl.java
package
com.kebin.dao.impl; import org.springframework.stereotype.Component; import com.kebin.dao.UserDao; import com.kebin.pojo.User; @Component("oracle") public class UserDao4OracleImpl implements UserDao { public void saveUser(User user) { System.out.println("----------oracle---------"); } }

userServiceImpl.java

package com.kebin.service.impl;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import com.kebin.dao.UserDao;
import com.kebin.pojo.User;
import com.kebin.service.UserService;
@Component("userService")
public class UserServiceImpl implements UserService {
    @Resource(name="oracle")
    private UserDao userDao;
    
    public void addUser(User user) {
        userDao.saveUser(user);
    }

}

  3.测试T.java;

package Test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


import com.kebin.pojo.User;
import com.kebin.service.UserService;

public class T {

    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext_kebin.xml");
        UserService userService = (UserService)ac.getBean("userService");
        userService.addUser(new User());        
    }

}

Spring AOP 学习小结

   一、aop的概念

  1.aspect   切面,它实际是Advice和Pointcut的组合;

  2.Advice:指切面应用的具体位置,对于Spring AOP 来讲,有Before advice、AfterreturningAdvice、ThrowAdvice、AroundAdvice(MethodInteceptor)等。

   3.pointcut 应用范围的指定(是在所有的save方法,还是所有的delete方法);

     列:@execution("public * *(..)")

     @execution("* saveUser*(..)")

     @execution("* addUser*(..)")

  4.Weaving:将Aspect加入到程序代码的过程,对于Spring AOP,由ProxyFactory或者ProxyFactoryBean负责织入动作。

将上面的项目重新配置,和添加addFuction.java,代码如下:

<?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"      
       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/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    <context:component-scan base-package="com.kebin.*"/>            
</beans>
package com.kebin.service.impl;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class AddFuction {

    @After("execution(public * *(..))")
    public void test(){
        System.out.println("-----------check-----------");
    }
}