前言:在web前端我们学习了springboot这种简洁的spring框架,但是我们并不知道spring boot具体操作的原理,而springboot是基于springframework改造的,所以我们这章节通过对其的学习来加深对springboot的理解。
Framework的系统架构
如图所示:

IOC(Inversion of Control)控制反转
++使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。++
Spring技术对IOC思想进行了实现:
Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的外部
IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean
DI (Dependency Injection )依赖注入
++在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入++
依赖的本质
*Service依赖DAO的意思是:
**"*我的业务逻辑需要操作数据库,但我不想自己写SQL,所以我需要一个助手(DAO)帮我做这些脏活累活!"
依赖的可视化表现:

依赖绑定(传统Framework方式):
<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 1. 定义DAO Bean -->
<bean id="userDao" class="com.example.dao.UserDaoImpl">
<!-- 可以注入DAO自己的依赖 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 2. 定义Service Bean -->
<bean id="userService" class="com.example.service.UserServiceImpl">
<!-- 绑定关键:ref属性指向userDao -->
<property name="userDao" ref="userDao"/>
</bean>
<!-- 3. 数据源配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
</beans>
与Springboot的不同:
核心区别:入口方式不同
**Spring Framework的传统方式:**需要自己创建一个"启动类"来初始化Spring容器
类比:

为什么需要这个App类?
因为Spring Framework只是一个"工具箱",你需要:
-
++自己组装:告诉Spring配置文件在哪++
-
++自己启动:调用API初始化容器++
-
++自己管理:获取Bean并使用++
public class MainApp { public static void main(String\[\] args) { // 1. 读取XML,创建容器 ApplicationContext context = new ClassPathXmlApplicationContext( "classpath:applicationContext.xml", "classpath:service-context.xml" // 可能还有多个配置文件 ); // 2. 手动获取Bean(麻烦!) UserService userService = (UserService) context.getBean("userService"); // 3. 使用 User user = new User("张三", "123456"); userService.register(user); // 4. 关闭容器(还要自己管理生命周期!) ((ClassPathXmlApplicationContext) context).close(); } }
**Spring Boot的现代方式:**Spring Boot自动帮你创建容器
@SpringBootApplication 这个注解包含了一切!
public class MyApp {
public static void main(String[] args) {
// 这一行代码做了Spring Framework中100行代码的事!
SpringApplication.run(MyApp.class, args);
}
}
实际上@SpringBootApplication = 三个注解的合并
@SpringBootConfiguration 相当于@Configuration
@EnableAutoConfiguration 自动配置魔法!
@ComponentScan 自动扫描组件
public @interface SpringBootApplication {}
SpringApplication.run()内部做了:
1. 创建Spring容器(根据classpath判断是Web还是普通应用)
2. 自动配置(根据依赖自动配置Bean)
3. 启动内嵌服务器(如果是Web应用)
4. 发布ApplicationStartedEvent事件
5. 调用CommandLineRunner
6. 启动完成!

bean的基础配置:我们在javaweb里学习过了,这里就不过多赘述。