一、为什么学习框架?
1. 学习框架相当于从“小作坊”到“工厂”的升级,小作坊什么都要自己做,工厂是组件式装配,特点就是高效。
2. 框架更加易用、简单且高效
第三方框架使用也越来越多,几乎所有的java项目都会使用的基础框架,叫做javaee框架;我们学习基础的框架SSM==》几大框架的简称:Spring Framework+SpringMVC+MyBates.
- Spring Framework:基础框架,包含很多组件;
- SpringMVC:web开发;
- MyBates:操作数据库的框架;
基于这些框架,对比之前的servlet、jdbc,灵活性,易用性,扩展性有很大提升。
SpringBoot 相比于 Servlet 的优点总结:
- 添加外部 jar 更容易,不易出错(版本问题无需关注);
- 调试项目更加方便,无需配置 Tomcat;
- 发布项目更加方便,无需配置 Tomcat;
- 添加路由更加方便,无需每个访问地址都添加一个类
使用框架,主要要学习更多的注解;
框架代码执行流程/顺序,与servlet相似,需要根据约定,先执行某个符合约定的类中哪个符合约定的方法,然后再执行其他哪个。(可能不知识程序本身调用的某个方法,而是在某个时间点或者某个事件,框架给我们调用某个方法)
Spring框架:Spring Framework
一个开源框架,包含着Spring容器/IoC容器、SpringMVC、SpringAOB。
1. IoC容器/Spring容器
对于Spring IoC容器来说,是管理Bean对象的容器。
Bean对象:普通的实力对象,(单纯从存放数据的角度看,和集合框架是一样的;)
但是其次还是有区别的;
使用集合存放队象:程序自己new,存储数据,调用队象的方法;
使用Spring容器存放队象:程序不需要自己去new,某些符合框架约定的方法是框架自动调用;(
需要框架管理,才放进去(不需要程序自己new)
不需要框架管理的,还是要自己去new。
)
IoC容器 vs 传统开发
使用IoC:按照框架约定的写法,就可以实现,框架统一管理Bean队象是生命周期(new,某些生命周期方法),bean队象之间的依赖关系。
2. DI:依赖注入
是从不同角度描述的同一个事情,有IoC容器运行时,自动的组织队象间的依赖关系(队象中的依赖(引用),框架自动给我们注入)
DI 和 IoC:
IoC是一种设计思想,他的实现方式包括IoC容器,而IoC容器的实现方式包括DI。
作用
解耦:
1. 自己写的代码来创建的队象及组织依赖关系,是强耦合的(一个对象需要修改代码,其他依赖这个对象的地方,也得改)。
2. 使用框架后,框架会给我们自动组织依赖关系,解耦。
原理:
三、开发方式
package org.example.model;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
// 以下四种注解都可以使用,都是类注解,用于注册Bean对象
@Controller
//@Service
//@Repository
//@Component
public class Bean对象1 {
public void sayHello() {
System.out.println("Hello");
}
}
public class Spring启动类 {
public static void main(String[] args) {
//ApplicationContext是Spring容器的顶级接口
//AnnotationConfigApplicationContext是其中一个实现类,
// 作用:
// 1. 扫描指定包路径下,使用Spring框架注解的类。
// 2. 注册这些类到容器中=》框架帮助我们new对象,及注入队象依赖关系
ApplicationContext context
= new AnnotationConfigApplicationContext("org.example");
// 获取Bean对象的两种方式
// 1. 获取Bean对象的id
// 2. 获取Bean对象的类型
Bean对象1 b1_1 = context.getBean(Bean对象1.class);
System.out.println(b1_1);
Bean对象1 b1_2 = (Bean对象1) context.getBean("bean对象1");
System.out.println(b1_2);
}
}
注意事项:
1.一定要被扫描到;
2.默认注册到容器中的bean id(名称),是类名的小写字母
3.默认类注解:
- @Controller
- @Service
- @Repository
- @Component
- @Configuration。
1~4是注册为普通的java bean对象;5是注册为配置类对象。
四、@Bean
package org.example.config;
import org.example.model.Bean对象2;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public Bean对象2 testBean2_1() {
return new Bean对象2();
}
@Bean
public Bean对象2 testBean2_2() {
return new Bean对象2();
}
}
Bean对象2 b2_1 = (Bean对象2) context.getBean("testBean2_1");
System.out.println(b2_1);
Bean对象2 b2_2 = (Bean对象2) context.getBean("testBean2_2");
System.out.println(b2_2);
// Bean对象2 b2_1 = (Bean对象2) context.getBean(Bean对象2.class);
// System.out.println(b2_1);
此时只能用类名的方法来获取对象。
实用类注解:默认是单例模式注册。
使用Bean注解:一个类型可以注册多个实例对象。