Spring是什么?
IOC(控制反转)、AOP(面相切面编程)、容器( 平常使用时,更多当成一个容器来看待,用来帮我们承载具体的bean对象)、生态(java的生态比较完整,主流框架技术都有,都是依托于spring进行开发,是后面框架的基石)
IoC(控制反转)是Spring的核心概念之一,它通过将对象的创建和依赖注入的控制权交给容器来实现。在IoC中,对象的依赖关系由容器负责管理,而不是由对象自己来创建和管理。这样,对象之间的耦合度降低了,代码变得更加可测试和可维护。
AOP(面向切面编程)是另一个重要的概念,它允许将横切关注点(例如日志记录、安全性、事务管理等)从应用程序的核心逻辑中分离出来,以便于重用、维护和管理。通过AOP,可以将这些横切关注点应用到整个应用程序中的多个对象上,而不需要修改它们的核心代码。
Spring容器是Spring框架的核心部分之一,它负责管理和组织应用程序中的对象。容器通过读取配置文件或注解来了解应用程序中的对象以及它们之间的依赖关系,并负责实例化、装配和管理这些对象。
Spring生态系统是指在Spring框架的支持下形成的各种相关技术和框架。由于Spring的开放性和灵活性,它成为了其他主流框架和技术的基石。例如,Spring MVC用于构建Web应用程序,Spring Boot用于简化和加速应用程序的开发,Spring Data用于访问和管理数据等等。这些技术都在Spring的生态系统中得到了广泛的应用和发展,使得Java的开发生态更加完整且易于使用。
概述
spring的生态比如springboot、springcloud都是基于spring Framework来做的
springboot在使用的过程中会调用这么一行代码。
如果是用spring,则用的是下面那行代码。
spring 3.0以后可以使用类的方式来充当配置文件。也可以使用注解来定义扫描的路径,当前是spring6了。
从spring容器中就可以通过context.getBean()来获取到对象
但是用ClassPathXmlApplicationContext其实已经过时了,在新版的Spring MVC和Spring Boot的底层主要用的都是AnnotationConfigApplicationContext,比如:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
//ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) context.getBean("userService");
userService.test();
可以看到AnnotationConfigApplicationContext的用法和ClassPathXmlApplicationContext是非常类似的,只不过需要传入的是一个class,而不是一个xml文件。
而AppConfig.class和spring.xml一样,表示Spring的配置,比如可以指定扫描路径,可以直接定义Bean,比如:
所以spring.xml和AppConfig.class本质上是一样的。
目前,我们基本很少直接使用上面这种方式来用Spring,而是使用Spring MVC,或者Spring Boot,但是它们都是基于上面这种方式的,都需要在内部去创建一个ApplicationContext的,只不过:
- Spring MVC创建的是XmlWebApplicationContext,和ClassPathXmlApplicationContext类似,都是基于XML配置的
- Spring Boot创建的是AnnotationConfigApplicationContext
因为AnnotationConfigApplicationContext是比较重要的,并且AnnotationConfigApplicationContext和ClassPathXmlApplicationContext大部分底层都是共同的
案例1
如果运行上面的main,那此时UserService的OrderService有没有值?
上面的肯定有值:依赖成功注入
下面的:肯定没有值
那我们知道spring肯定是通过UserService.class===>调用无参构造方法==》生成的对象
那背后的逻辑里,这时的orderservice肯定是没有值的。
所以生成的对象===》(中间肯定有一些过程,做完了)其实就是依赖注入(属性赋值)===》才能称为Bean
依赖注入大概工作原理
---------------------------------------------------------------------------------
中间过程其实还有:
对象==》依赖注入(属性赋值)==》初始化前=》初始化=》初始化后=》bean
案例2
希望我拿到的admin对象有值
问:如果把User加@Component注解加入容器,然后用@Autowired注解,会有值吗?
有,但不是我们要的值,spring不知道要去查哪个表,这个肯定要自己实现
解决方案:
方法1
spring会找哪个方法上加了@Postconstruct注解的