Spring框架(Bean配置详解)

前言

Spring是什么?是一个轻量级的IOC和AOP容器框架,为Java应用程序提供基础性服务的框架,用于企业应用程序开发的简化,使得开发者只需关心业务需求

一、IOC和DI的理解

1.什么是IOC(Inversion of Control)和DI(依赖注入)

根据英文我们可以知道指的是控制反转,其实Spring 中的IOC是一个容器,控制反转是它的设计思想,传统的设计是在类内部主动通过new创建对象,并主动创建依赖对象,类与类直接紧密联系,难以更改和测试;
IOC就是专门设计了一个容器,将创建个查找依赖对象的控制权交给容器,让IOC容器来对对象进行组合,类与类直接联系不紧密,体系结构变得灵活易于测试和更改。依赖注入其实和控制反转是一个概念,只是从不同的角度去描述
Spring框架(Bean配置详解)_第1张图片

2.IOC的实现

实现有两种方式,一个是使用XML配置方式实现,还有一个是使用注解配置方式;
如果采用XML方式来配置的话,Bean定义信息和Bean实现类本身是分离的,而采用注解的方式配置的话,Bean定义的信息即通过在Bean实现类上标注的注解实现。
(1)BeanFactory:IOC容器的基本实现,面向Spring本身
(2)ApplicationContext.xml:基于XML配置文件(推荐使用)ApplicationContext是BeanFactory的子接口,面向使用Spring框架的开发者
配置Bean:通过全类名配置
id:一般用将类型的首字母改为小写
class:全类名,通过反射方式在IOC中创建Bean,要求Bean中必须有无参数的构造器
在这里插入图片描述

		//1.创建Spring IOC容器对象,ApplicationContext表示容器,是一个接口,ClassPathXmlApplicationContext是ApplicationContext的一个实现类
		ApplicationContext ctx = new ("applicationContext.xml");//传入配置文件名
		//2.利用id定位到IOC容器中的bean,获取bean实例
		HelloWorld hw = (HelloWorld)ctx.getBean("helloWorld");//传入id

属性注入:
(1)setter方法注入

在java代码中写入setter方法
public void setName(String name) {
		System.out.println("setName()..."+name);
		this.name = name;
	}

配置文件配置

(2)构造方法注入,保证在Bean实例在实例化后可以使用,构造器在元素里申明属性,没有name属性,有value,可以指定参数的位置和类型,区分重载的构造器


按顺序

		
		
按下标:

		
按类型
  
  
  使用ref引用其他类属性
  

注入集合属性

		
			
				
				
				
			
			
	

其实还有很多,不用每个都记住,需要使用的时候可以查阅资料

注解配置

1.对bean的标注基于注解方式有:

  • @Component:放在一个类前边,他可以被Spring识别,Spring容器会自动将POJO转换为容器管理的Bean.他和XML配置是等效的:
  • @Repository:对DAO类进行标注
  • @Service:对Service类进行标注
  • @Controller:对Controller类进行标注
    2.获得基于注解的bean配置信息,需要配置context:component-scan进行扫描
    3.使用@Autowired注解实现Bean的依赖注入,默认按照类型byType的方式匹配;
    @Autowired 标注的变量中。如果在Spring启动时没有一个和标注变量类型匹配的 bean ,则会抛NoSuchBeanDefinitionException 异常,如果希望 Spring 即使找不到匹配的 bean 也不要抛出异常,可以使用@Autowired(required=false) 进行标注

二、AOP

1.什么是AOP

AOP是Spring框架的面向切面的编程思想,是对面向对象思想的一种补充,通俗的说就是将涉及多业务流程的通用功能抽取并单独封装,形成独立的切面,在合适的时机切入到业务流程指定的位置。它的出现是为了解决代码冗余问题,假设在一个复杂的业务系统中,用户登录是基础功能,存在多个业务涉及用户登录:
传统设计思想:把登录功能实现代码写入每个业务流程中,造成许多的代码冗余,维护和更新非常麻烦。

使用动态代理思想:使用一个代理将对象包装起来,然后该代理对象取代原始对象,任何对原始对象的调用都要通过该代理,代理对象决定是否以及何时将方法调用转到原始对象上

AOP的思想类似动态代理的思想,将这个登录功能抽取出来形成独立的模块,当业务流程需要用到的时候,系统自动将登录模块切入到业务流程中。
基本概念:

  • 切面(Aspect):一个横切关注点(跨越应用程序多个模块的功能)被模块化的特殊对象,一个关注点可能有多个对象,实现的方式是基于@Aspect注解
  • 连接点(Jointpoint)在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候,一个连接点总是表示一个方法的执行
  • 通知(Advice):在切面的某个特定连接点上执行的动作,是切面必须要完成的动作,有around,after,before等不同类型的通知
  • 切入点(Pointcut):匹配连接点的断言,通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行
  • 引入(Introduction):用来给一个类型声明额外的方法或属性,Spring允许引入新的接口到任何被代理的对象
  • 目标对象(Target Object):被一个或多个切面通知的而对象
  • AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约,执行动作,向目标对象应用通知之后创建的对象
  • 织入(WeaVing):把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象

通知的类型

  • 前置通知:在某连接点之前执行的通知,这个通知不能组织连接点之前的执行流程
  • 后置通知:在某连接点正常完成后执行的通知
  • 异常通知:在方法抛出异常退出时执行的通知
  • 最终通知:当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)
  • 环绕通知:保卫一个连接点的通知,如方法调用

2.代码实现(基于注解)

(1)引入需要的jar包
Spring框架(Bean配置详解)_第2张图片
(2)完成实体类
①业务代码:被注释掉的部分是需要用AOP实现的部分

package com.lm.aop.impl;

public interface ArithmeticCalculator {
	int add(int i,int j);
	int sub(int i,int j);
}

package com.lm.aop.impl;

import org.springframework.stereotype.Component;

@Component
public class ArithmentCalculatorImpl implements ArithmeticCalculator{
	//实现加法
	public int add(int i,int j) {
//		System.out.println("The method add begins");
		int res = i+j;
		return res;
//		System.out.println("The method add end");
	}
	//实现减法
	public int sub(int i,int j) {
//		System.out.println("The method sub begins");
		int res = i-j;
		return res;
//		System.out.println("The method sub end");
	}
}

②创建将涉及多业务的代码抽象出一个模块类

public class LoggingAspect {
	public void beforeMethod() {
		System.out.println("The method begins");
	}
	
	public void afterMethod() {
		System.out.println("The method end");
	}
}

(3)基于注解的方式
①将模块类加入到IOC容器中,添加@Component;再把该类声明为切面,添加@Aspect
Spring框架(Bean配置详解)_第3张图片
②声明该模块类方法在何时被执行
在这里插入图片描述
③在配置文件中加入配置,使得注解起作用
1)创建ApplicationContext.xml文件
2)导入AOP架构,aop.xml需要使用AOP命名空间,因此需要在配置文件中导入spring-aop架构,添加下面的AOP命名空间。
Spring框架(Bean配置详解)_第4张图片
Spring框架(Bean配置详解)_第5张图片
3)配置自动扫描包和生成代理
Spring框架(Bean配置详解)_第6张图片
4)测试代码

public class Main {
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		ArithmeticCalculator ac = ctx.getBean(ArithmeticCalculator.class);
		int res = ac.add(2, 3);
		System.out.println(res);
	}
}

Spring框架(Bean配置详解)_第7张图片
5)如果要传入参数,则修改为
Spring框架(Bean配置详解)_第8张图片
运行:
Spring框架(Bean配置详解)_第9张图片

3.代码实现(基于配置文件)

XML文件配置内容:
1.配置bean
2.配置切面的bean
3.配置AOP
4.配置切点表达式
4.配置切面及通知

Spring框架(Bean配置详解)_第10张图片
运行效果如下
Spring框架(Bean配置详解)_第11张图片

多练几次吧!

你可能感兴趣的:(Spring框架(Bean配置详解))