文章目录
Spring是什么
Spring是一个包含众多工具的IoC容器
容器
- list/map 装数据的容器
- tomcat 装web的容器
Spring容器装的是对象
Ioc 详解
Ioc是控制反转
控制权反转,创建对象的控制权反转了,交给了Spring。
注解就是控制反转的应用。
Bean的存储
把对象交给IoC容器管理需要在类上加一个注解:@Component,Spring为了更好的服务Web开发,还提供了其他的注解。
类注解:
@Controller
(控制存储器)
@Service
(服务存储)
@Repository
(仓库存储)
@Component
(组件存储)
@Configuration
(配置存储)
方法注解:
@Bean
@Controller(控制存储器)
使⽤ @Controller 存储 bean :
@Controller // 将对象存储到 Spring 中
public class UserController {
public void doController(){
System.out.println("do Controller...");
}
}
观察这个对象是否已经存在Spring容器当中:
Spring上下文
//Spring上下文
ApplicationContext context = (ApplicationContext) SpringApplication.run(DemoApplication.class, args);
返回的就是Spring的运行环境。
从Spring容器中获取对象:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//获取Spring上下⽂对象
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
//从Spring上下⽂中获取对象
UserController bean = context.getBean(UserController.class);
//使⽤对象
bean.doController();
}
}
观察运⾏结果, 发现成功从Spring中获取到Controller对象, 并执⾏Controller的doController⽅法。
如果去除Controller注解,就会报如下错误:
没有如下Bean的定义:
@Service(服务存储)
使⽤ @Service
存储 bean :
@Service
public class UserService {
public void doService(){
System.out.println("do service...");
}
}
读取 bean 的代码:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//Spring 上下文
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
//从Spring中获取UserService对象
UserService userService = context.getBean(UserService.class);
//使⽤对象
userService.doService();
}
}
运行:
如果把注解去掉:
获取bean对象还有其他的⽅式:
根据名称获取bean
//根据名称获取bean
UserService userService2 = (UserService) context.getBean("userService");
userService2.doService();
根据名称和类型获取bean
//根据名称和类型获取bean
UserService userService3 = context.getBean("userService",UserService.class);
userService3.doService();
有一种特殊情况:如果类名前两位都为大写,bean的名称为类名,如:
官方文档让我们参考decapitalize这个方法:
decapitalize这个方法是有jdk本身提供的。
如下代码就是Bean名称内部的实现方式。
ApplicationContext 和BeanFactory区别
先看源码:
很明显可以发现:他们是继承关系,所以BeanFactory具有的功能ApplicationContext 都有,另一些功能就是别的类所赋予的了。比如:
EnvironmentCapable
:环境相关,ApplicationContext 可以拿到环境相关的一些配置比如:jdk几
ListableBeanFactory
:处理bean
ApplicationEventPublisher
:事件相关,通知
ResourcePatternResolver
:资源管理
- 继承关系和功能⽅⾯来说:
Spring 容器有两个顶级的接⼝:BeanFactory 和ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能⼒,而ApplicationContext 属于 BeanFactory 的⼦类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持. - 从性能⽅⾯来说:
ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,⽽BeanFactory 是需要哪个才去加载哪个,因此更加轻量. (空间换时间)
@Repository(仓库存储)
存数据的仓库
使⽤ @Repository
存储 bean 的代码:
@Repository
public class UserRepository {
public void doRepository(){
System.out.println("do repo...");
}
}
读取 bean 的代码:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//Spring 上下文
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
// 从context中获取bean
UserRepository userRepository = context.getBean(UserRepository.class);
userRepository.doRepository();
}
}
@Component(组件存储)
使⽤ @Component
存储 bean 的代码:
@Component
public class UserComponent {
public void doComponent(){
System.out.println("do Component...");
}
}
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//Spring 上下文
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
// 从context中获取bean
UserComponent userComponent = context.getBean(UserComponent.class);
userComponent.doComponent();
}
}
@Configuration(配置存储)
使⽤ @Configuration 存储 bean 的代码:
@Configuration
public class UserConfiguration {
public void doConfiguration(){
System.out.println("do Configuration...");
}
}
读取 bean 的代码:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//Spring 上下文
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
// 从context中获取bean
UserConfiguration userConfiguration = context.getBean(UserConfiguration.class);
userConfiguration.doConfiguration();
}
}
类注解存在原因
让程序员看到类注解之后,就能直接了解当前类的⽤途。
@Controller
:控制层, 接收请求, 对请求进⾏处理, 并进⾏响应.@Servie
:业务逻辑层, 处理具体的业务逻辑.@Repository
:数据访问层,也称为持久层. 负责数据访问操作@Configuration
:配置层. 处理项⽬中的⼀些配置信息
程序的应用分层,调用流程如下:
如果想被外界访问到只能用Controller