学习就是知道未知的事情,如何向一个人解释清楚一个他未知的概念?
答案就是用已知的概念去类比他未知的概念
spring 是什么? 有什么用?
spring 是java的一个框架
目的是为了解决企业开发的复杂性(可以使java程序更快速,更简便,更安全)
怎么解决程序之间的复杂性?
将所有程序集中放入一个中间件,进行集中式的管理
bean是什么?
包装过的对象,包装的目的:统一规格
什么是IOC?(幼儿园招生的过程)(解耦,将一堆小朋友交到一个地方)
IoC - Inversion of Control
, 控制反转:把创建和管理 bean 的过程转移给了第三方(第三方是一个容器,名字叫IOC container)(IOC这个过程的目的是为了让bean得到统一的处理)
为什么有IOC continer?(容器相当于一个幼儿园,里面幼儿园老师管理小朋友)
因为项目中每次创建对象是很麻烦的,所以我们使用 Spring IoC 容器来管理这些对象,需要的时候你就直接用,不用管它是怎么来的、什么时候要销毁,只管用就好了
IOC容器负责(幼儿的老师)
- 创建、配置和管理bean
- 管理bean的生命
- 控制bean的依赖注入
如何设计IOC container
?(通过什么方式建立幼儿园)
使用 ApplicationContext
这个类,它是 BeanFactory
(可以管理任何类型的对象)的子类
Beanfactory
可以理解为Hashmap
(key,value形式:bean name,bean object)
为什么不直接使用 BeanFactory
?
BeanFactory
一般只有 get 和 put 功能,所以称之为“低级容器”。
而 ApplicationContext
多了很多功能,因为它继承了多个接口,可称之为“高级容器”。
IOC container
怎样获取 bean?(招生)
通过读取 configuration metadata
(学生申请名单)获得关于要实例化、配置和组装哪些对象的信息(决定要哪些学生,学生之间还可以建立联系,如班长,学习委员等)
在Container
本身内,这些bean定义表示为BeanDefinition
对象(学号,包含了这个学生所有的信息)
BeanDefinition
对象里面的 metadata
(如包限定的类名)表示单个bean的一组属性(真正表示学生的所有信息)
所以获取bean的方式就是读取configuration metadata
(学生申请名单,xml形式)
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
控制反转:将权利将给别人
控制(自己炒股)掌控权利
反转(把钱给别人炒股) 放权
依赖注入:一种具体实现行为
依赖(程序运行时需要外部资源为其提供数据)需求
注入(配置文件将数据注入到程序内部)行动
所以控制反转是一种思想(理论),依赖注入就是其具体的实现方式(实践)
当然,IoC 也可以通过其他的方式来实现,而 DI 只是 Spring 的选择
注解编程
写xml太麻烦了,那么就用注解吧
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--指定注解扫描包-->
<context:component-scan base-package="com.zhang"/>
<!--开启属性注解支持-->
<context:annotation-config/>
</beans>
Component
表明这个类被Spring接管,注册到了容器中
为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。
@Controller
:web层@Service
:service层@Repository
:dao层
@Autowired
:对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作
@Qualifier
按照名称去装配 bean
<bean id="dog" class="zhang.pojo.Dog"/>
<bean id="dog2" class="zhang.pojo.Dog"/>
@Autowired //不能省略
@Qualifier(value = "dog") //需要知道id
private Dog dog;
@Resource 根据byName的方式自动装配
@Resource(name = "dog2") //没有了Autowired
<bean id="dog3" class="zhang.pojo.Dog"/>
<bean id="dog2" class="zhang.pojo.Dog"/>
一个类中要引用另一个类 如A引用B
@Component
public class B {}
@Component
public class Asd {
@Autowired //一定要加,注册到容器中
public B b ;
}