Spring是什么?是一个轻量级的IOC和AOP容器框架,为Java应用程序提供基础性服务的框架,用于企业应用程序开发的简化,使得开发者只需关心业务需求
根据英文我们可以知道指的是控制反转,其实Spring 中的IOC是一个容器,控制反转是它的设计思想,传统的设计是在类内部主动通过new创建对象,并主动创建依赖对象,类与类直接紧密联系,难以更改和测试;
IOC就是专门设计了一个容器,将创建个查找依赖对象的控制权交给容器,让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的标注基于注解方式有:
AOP是Spring框架的面向切面的编程思想,是对面向对象思想的一种补充,通俗的说就是将涉及多业务流程的通用功能抽取并单独封装,形成独立的切面,在合适的时机切入到业务流程指定的位置。它的出现是为了解决代码冗余问题,假设在一个复杂的业务系统中,用户登录是基础功能,存在多个业务涉及用户登录:
传统设计思想:把登录功能实现代码写入每个业务流程中,造成许多的代码冗余,维护和更新非常麻烦。
使用动态代理思想:使用一个代理将对象包装起来,然后该代理对象取代原始对象,任何对原始对象的调用都要通过该代理,代理对象决定是否以及何时将方法调用转到原始对象上
AOP的思想类似动态代理的思想,将这个登录功能抽取出来形成独立的模块,当业务流程需要用到的时候,系统自动将登录模块切入到业务流程中。
基本概念:
通知的类型
(1)引入需要的jar包
(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
②声明该模块类方法在何时被执行
③在配置文件中加入配置,使得注解起作用
1)创建ApplicationContext.xml文件
2)导入AOP架构,aop.xml需要使用AOP命名空间,因此需要在配置文件中导入spring-aop架构,添加下面的AOP命名空间。
3)配置自动扫描包和生成代理
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);
}
}
XML文件配置内容:
1.配置bean
2.配置切面的bean
3.配置AOP
4.配置切点表达式
4.配置切面及通知
多练几次吧!