目录
💟这里是CS大白话专场,让枯燥的学习变得有趣!
💟没有对象不要怕,我们new一个出来,每天对ta说不尽情话!
💟好记性不如烂键盘,自己总结不如收藏别人!
💌Spring是一个优秀的Java开发框架,通过如下策略简化了开发过程:
🍠基于POJO(Plain Ordinary Java Object)的轻量级和最小侵入性编程;
🍠通过依赖注入和面向接口实现松耦合;
🍠基于切面和惯例进行声明式编程;
🍠通过切面和模板减少样板式代码。
💌乍一看是不是很懵,这些策略与Spring中最重要的两个核心IOC和AOP有关,我们需要先深刻理解IOC和AOP到底是干什么事!
🧡IoC
💌二话不说先翻译:IoC(Inversion of Control)中文名:控制反转。它是Spring全家桶各个功能模块的基础,是用于给每个模块创建对象的容器。简单点说就是在使用框架的时候,IoC自动创建、组装好了所有的组件,开发者直接用就行了,拿来吧你!
有两种方式使用IoC:
🍠基于XML(了解)
开发者在XML中配置需要的对象,Spring根据XML文件内容来创建对象。
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
🍠基于注解(常见)
1、@Configuration配置类:用一个Java类BeanConfiguration替代XML文件,把XML中的配置放到配置类@Bean中。
@Configuration
public class BeanConfiguration{
@Bean(value= "config") //如果不设置value/name,则默认类名dataConfig
public DataConfig dataConfig(){
DataConfig dataConfig = new DataConfig();
DataConfig.setDrivername("Driver");
...
return dataConfig;
}
}
ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfiguration.class);
System.out.println(context.getBean("config")); //默认"dataConfig"或直接Dataconfig.class
2、扫包+注解:不需要依赖XML和配置类,直接由目标类添加注解@Component来创建bean,对参数添加注解@Value可进行赋值。有注解的类会被加载到IoC中,在扫描IoC包的时候可进行读取。
@Data
@Component("config")
public class DataConfig{
@Value("Driver")
private String driverName;
...
}
ApplicationContext context = new AnnotationConfigApplicationContext("com.southwind.ioc");
P.S.@Autowired自动创建对象,通过类型完成依赖注入。 使用@Qualifier可通过名字查找。
💌到这里就有个问题,这跟控制反转有什么关系呢?这里的控制指的就是对象创建的权利,反转则是一个把控制权外部框架的大动作,我们无需手动创建对象,交给IoC去处理。
🧡AOP
💌二话不说先翻译:AOP(Aspect-Oriented Programming)中文名:面向切面编程。 它也是以IoC为基础的,将切面抽象化成对象进行编程,将日志代码与业务代码解耦合,依旧是面向对象的思维。应用:打印日志、事务、权限处理等。看图说话更易理解:
💌简单地说就是把相同位置相同的操作提取出来,创建一个切面类来封装这些操作。整体实现流程如下:
🍠创建切面类
@Component
@Aspect
public class LoggerAspect{
@Before("execution(public int com.southwind.aop.CalImpl.*(..))")
public void before(JoinPoint joinPoint){
String name = joinPoint.getSignature().getName();
System.out.println(name + "参数:" + Arrays.toString(joinPoint.getArgs()));
}
@AfterReturning(value="execution(public int com.southwind.aop.CalImpl.*(..))",returning="result")
public void afterReturning(JoinPoint joinPoint,Object result){
String name = joinPoint.getSignature().getName();
System.out.println(name + "结果:" + result);
}
}
🍠实现类添加@Component
@Component
public class CalImpl implements Cal{
@Override
public int add(int a, int b){
int result = a + b;
return result;
}
...
}
🍠配置自动扫包,开启自动生成代理
💌非常重要的一步,我们调用的是生成的代理对象,是由实现类和切面类共同产生的,一个切面类只能对应一个实现类,若没有生成代理,或实现类对应错误,则不会打印切面类的内容。SpringBoot中此步已自动配置。
<context:component-scan base-package="com.southwind.aop"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
🍠使用
public class Test{
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
Cal bean = context.getBean(Cal.class);
System.out.println(bean.add(1,2));
...
}
}
💌那么话说回来,Spring是怎么简化开发的捏?文章开头的四点就好理解了:
IoC的核心功能:
🍠基于POJO(Plain Ordinary Java Object)的轻量级和最小侵入性编程;
把bean交给容器来控制,无需人为干预,我们只需编写业务逻辑,框架不会对我们产生限制。
🍠通过依赖注入和面向接口实现松耦合;
通过DI完成属性赋值操作,通过接口实现Spring框架的二次开发扩展。
AOP的核心功能:
🍠基于切面和惯例进行声明式编程;
帮我们控制事务的回滚、提交。
🍠通过切面和模板减少样板式代码。
将日志代码写入切面对象,不需要更改核心业务代码,只需要在切面类中编写在哪些地方进行切入。