spring 基本概念:
Ioc(DI) 控制反转(依赖注入)
Aop 切面编程
IOC 是一种思想 (控制权转移)
DI 是一种具体实现 (反射= java 动态编译 class 类实例)
顺序编程中依赖关系 , DI由容器负责依赖关系管理
类似于中介编程只需要某个对象,而这个对象所需要的其他资源(对象,数据等)不需要知道,有中介负责
一、单属性值的装配
//setter注入,提供无参构造器,提供setXX方法
<property name="" value=""></property>
//如果该value是另外一个bean的引用
<property name="" ref=" 另一个bean的id"></property>
//构造器注入
<contructor-arg value=" ">
//如果该value是另外一个bean的引用
<contructor-arg ref="另一个bean的id">
二、复数属性值的装配
当bean的属性值是复数时,即属性的类型是集合。
当配置集合类型的bean属性时,spring提供了4种类型的集合配置元素,如下:
集合元素 用途
装配list类型的值,允许重复
装配set类型,不允许重复
<bean id="userService" class="com.spring.service.UserService">
<property name="list">
<list>
<value>aaaa</value>
<value>bbbb</value>
</list>
</property>
</bean>
//2、set集合
<bean id="userService" class="com.spring.service.UserService">
<property name="set">
<set>
<value>cccc</value>
<value>dddd</value>
</set>
</property>
</bean>
//3、map集合
<bean id="userService" class="com.spring.service.UserService">
<property name="set">
<map>
<entry key="1111" value="aaaa"/>
<entry key="2222" value="bbbb"/>
</map>
</property>
</bean>
//4、properties
<bean id="userService" class="com.spring.service.UserService">
<property name="pro">
<props>
<prop key="1111">aaaa</prop>
<prop key="2222">cccc</prop>
</props>
</property>
</bean>
bean命名空间配置方式(util c p)
注解:
@Autowired
@Qualifier("service")//限定符 service= beanId
EmployeeService employeeService;
@Service("service")
public class EmployeeServiceImpl implements EmployeeService {
public EmployeeDto getEmployeeById(Long id) {
return new EmployeeDto();
}
}
@Scope 简单点说就是用来指定bean的作用域 (也可以在xml配置中设置scope属性)
scope:prototype、request、session、global session作用域
Ioc容器 AOP
DefaultListableBeanFactory核心
DefaultListableBeanFactory加载配置文件XML等
会有不同的实现类加载不同类型的文件
BeanDefinition对应java bean
通过不同的解析不同的XML标签 完成bean的初始化
BeanFactory工厂存放不同的bean实例
bean实例AbstractBeanDefinition是BeanDefinition的实现类
ApplicationContext是BeanFactory的扩展,扩展了很多功能
NamespaceHandler标签解析器接口(具体的实现类解析XML标签 比如:<context:component-scan base-package="com.org.cbs" />)
完成解析后初始化BeanFactory实例
BeanDefinitionParser 解析器接口(具体实现类)对BeanFactory实例
进行增强,增加其他操作
示例:
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml");
DemoBean demo = (DemoBean) context.getBean("demoBean");
spring代码设计
定义结构
分解实现具体方法
定义接口功能
扩展接口实现
Ioc容器 反射 bean管理 BeanDefinition
代理模式 aop
工厂模式 各种beanFactory
观察者模式 监听器 (ApplicationListener监听器实现此接口)
模板模式 各种接口 spring jdbc
单例模式 spring默认bean是单例的
策略模式 xml 标签解析器 (spring mvc)
装饰器模式 beanWrapper
适配器模式 springmvc HandlerMapping HandlerAdapter
责任链模式 HandlerExecutionChain 主要负责请求的拦截器的执行和请求的处理,但是他本身不处理请求,
只是将请求分配给在链上注册的处理器执行,这是一种责任链的实现方式
HandlerExecutionChain维护了HandlerInterceptor(拦截器)的集合,可以向其中注册相应的HandlerInterceptor
Spring定义bean的三种方式和自动注入
https://blog.csdn.net/sinat_34596644/article/details/53080026
Spring定义bean的三种方式
1. 基于XML的bean定义(需要提供setter方法)
2. 基于注解的bean定义(不需要提供setter方法)
Spring为此提供了四个注解,这些注解的作用与上面的XML定义bean效果一致,在于将组件交给Spring容器管理。组件的名称默认是类名(首字母变小写),也可以自己修改:
@Component:当对组件的层次难以定位的时候使用这个注解
@Controller:表示控制层的组件
@Service:表示业务逻辑层的组件
@Repository:表示数据访问层的组件
使用这些注解的时候还有一个地方需要注意,就是需要在applicationContext.xml中声明<contex:component-scan...>一项,指明Spring容器扫描组件的包目录。
3. 基于Java类的bean定义(需要提供setter方法)
@Configuration
public class BeansConfiguration {
@Bean
public Student student(){
Student student=new Student();
student.setName("张三");
student.setTeacher(teacher());
return student;
}
}
Spring的自动注入
Spring提供了五种自动装配的类型
no:顾名思义, 显式指明不使用Spring的自动装配功能
byName:根据属性和组件的名称匹配关系来实现bean的自动装配
byType:根据属性和组件的类型匹配关系来实现bean的自动装配,有多个适合类型的对象时装配失败
constructor:与byType类似是根据类型进行自动装配,但是要求待装配的bean有相应的构造函数
autodetect:利用Spring的自省机制判断使用byType或是constructor装配