Spring 核心概念

一、IOC控制反转

IOC全称Inversion of Control

IOC是一种编程思想,之前开发过程中使用对象内部的属性方法需要使用关键字 new进行对象实例的创建,IOC可以理解为 容器 的概念,有了IOC之后,进行对象实例的创建不需要程序员主动去new 对象,而是直接可以从容器中直接获取,我们只需要在获取前配置好Bean的配置文件即可

获取Bean对象的方式有两种
1.通过BeanFactory方式获取

	 BeanFactory context = new ClassPathXmlApplicationContext("bean.xml");
	 context.getBean("userService",UserServiceImpl.class);

2.通过ApplicationContext方式获取

	  ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
	 context.getBean("userService",UserServiceImpl.class);

二、DI依赖注入

DI全称Dependency Injection

是ioc控制反转实现的一种方式

依赖注入:个人理解 Class(A) 在执行某些操作需要依赖Class(B)中的方法,所以需要将Class(B)的实例注入到Class(A)的成员属性中,这种依赖关系称之为依赖注入,我们可以在bean的配置文件中声明这种依赖关系

	<bean id="ClassB" class="org.example.dao.impl.ClassB"/>
	<bean id="ClassA" class="org.example.service.impl.ClassA">
		 <property name="ClassB" ref="ClassB"/>
	</bean>

三、 AOP

DI全称Aspect Oriented Programming 面向切面编程是一种编程思想

作用: 在不改动原始方法代码的基础上对方法做出功能上的增强,对项目中公共业务的抽离封装,降低耦合度

核心概念:
1.代理(Proxy)Spring中AOP原理是采用代理模式实现的
2.连接点(JoinPoint):理解为任意方法
3.切入点(Pointcut):匹配连接点的式子
4.通知(Advice):执行增强的方法,和切入点一起使用,为原始方法增强功能
5.切面(Aspect):代表切入点与通知的关系

AOP相关注解
@EnableAspectJAutoProxy 在SpringConfig中配置 开启Spring对AOP注解的支持

@Component Bean注解

@Aspect 定义当前类为AOP切面类

@Pointcut 声明切入点

@Before 前置通知

@After 后置通知

@Around 环绕通知

@AfterReturning 原始方法返回后通知(了解)

@AfterThrowing 原始方法抛出异常通知(了解)

切入点表达式 执行关键字(方法访问修饰符 返回值 包名称.类/接口.方法名(参数)异常)通常不使用异常作为匹配

作用: 匹配要被增强的方法

execution(public User com.aops.dao.BookDao.save(ina))
//	*为通配符 类似mysql的前置后置模糊查询
 execution(public * com.aops.dao.*Dao.save(ina))
// .. 多个连续的任意符号,可以简化包名 和 方法的参数
 execution(public * com..dao.*Dao.save(..))
// + 匹配子类型
 execution(* * ..dao.*Dao+.*(..))

execcution 切入点表达式

demo:


//在SpringConfig中开启AOP注解支持
@EnableAspectJAutoProxy
public class SpringConfig {}

==============================================================

//声明一个要被增强的方法

public interface BookDao {
    String save(int a,String b);
}

public class BookDaoImpl implements BookDao {

    public String save(int a,String b) {
        System.out.println("======================");
        System.out.println("原始方法开始执行");
        System.out.println("参数1:" + a);
        System.out.println("参数2:"+ b);
        System.out.println("BookDaoImpl....save()");
        System.out.println("======================");
        return b;
    }
}
==============================================================
//新建aop包 创建MyAdvice AOP通知

@Component //声明Bean
@Aspect	//当前类为AOP切面通知类
public class MyAdvice {
    //声明一个切入点 匹配方法
    @Pointcut("execution(* org.aops.dao.BookDao.save(..))")
    private void pt() {}

    //测试获取请求参数 和返回值
    
    //如果不需要使用参数,不使用或不处理 JoinPoint ProceedingJoinPoint形参即可

    @Before("pt()")
    public void paramBefore(JoinPoint jp) {
        Object[] params = jp.getArgs();
        System.out.println("前置通知中获取到的参数:" + Arrays.toString(params));
    }

    @After("pt()")
    public void paramAfter(JoinPoint jp) {
        Object[] params = jp.getArgs();
        System.out.println("后置通知中获取到的参数:" + Arrays.toString(params));
    }

    @Around("pt()")
    public Object paramAround(ProceedingJoinPoint p){
        System.out.println("环绕通知开始执行");
        Object[] params  = p.getArgs(); //
        params[0] = 9999;   //环绕通知中可以修改方法的参数然后调用
        Object result = null;
        //调用原始方法 必须使用ProceedingJoinPoint且必须有异常处理
        try {
            result = p.proceed(params);
        }catch (Throwable t) {
            t.printStackTrace();
        }
        System.out.println("环绕通知执行结束");
        System.out.println("环绕通知执行结果的返回值" + result);
        System.out.println("环绕通知通知中获取到的参数:" + Arrays.toString(params));
        return result;
    }

    //
    @AfterReturning(value = "pt()",returning = "result") //原始方法返回值 使用result接收
    public void afterReturning(Object result) {
        System.out.println("方法执行结束了:::" + "返回值为:" + result);
    }


    @AfterThrowing(value = "pt()",throwing = "t") //原始方法异常 用变量t接收
    public void afterThrowing(Throwable t) {
        System.out.println("【Exception】方法错误 报出异常调用了:" + t);
    }
}

==============================================================
//开始调用
 ApplicationContext c = new AnnotationConfigApplicationContext(SpringConfig.class);
 BookDao bookDao = c.getBean(BookDao.class);
 bookDao.save(1,"《三国演义》");

结果:

环绕通知开始执行
前置通知中获取到的参数:[9999, 《三国演义》]
======================
原始方法开始执行
参数19999
参数2:《三国演义》
BookDaoImpl....save()
======================
方法执行结束了:::返回值为:《三国演义》
后置通知中获取到的参数:[9999, 《三国演义》]
环绕通知执行结束
环绕通知执行结果的返回值《三国演义》
环绕通知通知中获取到的参数:[9999, 《三国演义》]

Process finished with exit code 0
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值