Spring IOC(控制反转,也叫反转) 概念:将创建对象的过程交给Spring容器去处理,学名叫:控制反转也对反转,
要理解IOC就要解决下边的问题
“谁控制谁?控制什么?为何是反转(有反转就有正转)?哪些方面反转了”
答:
谁控制谁?控制什么?,在传统的开发中,我们是通过在对象内部new进行创建对象,是程序主动去创建依赖对象,而IOC是有专门容器来创建这些对象,由IOC容器来控制对象的创建,“谁控制谁”,就是IOC容器控制对象,“控制什么”主要控制了外部资源的获取
为何是反转?哪些方面反转了?,传统应用程序是由我们自己在对象中主动控制去获取依赖对象,也就是正转,而反转就是容器来帮我们创建及注入依赖对象,为何是反转,因为由我们容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,哪些方面反转了?依赖对象反转了
操作就是在applicationContext.xml文件中,配置bean
//在Test测试中,通过下面方式调用bean,完成对象的创建
ApplicationContext ac=new ClassPathXmlApplication("applicationContext.xml");
//根据bean的id查找到对象
//默认用构造器创建实例对象
UserDao userdao1=(UserDao)ac.getBean("userDao");
//用静态工厂方法创建实例对象
UserDao userdao2=(UserDao)ac.getBean("userDao2");
//静态工厂方法
public class UserFactory {
// 静态方法
public static User getUser1() {
return new User();
}
}
//实例工厂方法
public class UserFactory {
//普通方法
public User getUser2() {
return new User();
}
}
private UserDao userdao;
public UserDao(UserDao userdao){
this.userdao=userdao;
}
private UserDao udao;
public UserDao getUserDao() {
return uDao;
}public void setUserDao(UserDao userDao) {
this.uDao = userDao;
}
public class MyJDKProxy {
/**
* 采用JDK的动态代理来实现对一个类的增加
* 只能针对实现接口的类进行增强,如果目标类没有实现接口则无效
*/
private Object obj;
public MyJDKProxy(Object object){
this.obj=object;
}/**
* newProxyInstance(用哪个类加载器去加载代理对象,动态代理类需要实现的接口,动态代理方法在执行时,
* 会调用h里面的invoke方法去执行);
* @return
*/
public Object greateProxy(){
Object proxy= Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("findAll".equals(method.getName())){
System.out.println("进行日志记录!!");
return method.invoke(obj,args);
}
return method.invoke(obj,args);
}
});
return proxy;
}
}
public Object createProxy(){
// 通过CGLIB动态代理获取代理对象的过程
Enhancer enhancer = new Enhancer();
// 设置enhancer对象的父类
enhancer.setSuperclass(obj.class);
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
if("findAll".equals(method.getName())){
System.out.println("cglib记录日志!!!");
return methodProxy.invokeSuper(proxy,objects);
}
return methodProxy.invokeSuper(proxy,objects);
}
});
Object proxy=enhancer.create();
return proxy;
}
@Aspect
@Component("myLog")
//@Pointcut声明一个切入点,范围为com.mooc.service.impl包下的findAll()方法
@Pointcut("execution(* com.mooc.service.impl.*.findAll(..))")
public void pointCut(){
System.out.println("切面");
}
@Before("pointCut()")//前置通知
public void before(JoinPoint joinPoint){
System.out.println("前置通知!!");
}
@After("pointCut()")//后置通知
public void after(JoinPoint joinPoint){
System.out.println("后置通知!!");
}
@AfterReturning(value = "https://www.it610.com/article/pointCut()",returning ="obj")
public void afterruning(Object obj){
System.out.println("后置增强"+obj);
}
@AfterThrowing(value = "https://www.it610.com/article/pointCut()",throwing = "e")
public void afterThrowing(Throwable e){
System.out.println("异常"+e.getMessage());
}
@Around("pointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
System.out.println("前置环绕");
Object obj=point.proceed();
System.out.println("后置环绕");
return obj;
}