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-----------"); } }

浙公网安备 33010602011771号