本文 作者 就是随笔记,几乎没有排版,里面也是乱七八糟,于是把它归为乱七八糟分类。对了 这是阅读《Spring实战4》的随笔。
什么是 依赖注入?
DI 功能是如何实现的
任何一个有实际意义的应用都会由多个类组成,这些类相互之间进行协作来完成特定的业务逻辑。
通过DI 对象的依赖关系将由系统中负责协调个对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系。
- 构造器注入:在构造的时候把探险任务作为构造器参数传入。
装配
创建应用组件之间协作的行为。spring 有 Java配置、XML装配和自动装配。
XML
<beans ......>
<!-- 把类 声明为 bean -->
<bean id="唯一key" class="指定 对应类" />
</beans>
Java配置
@Configuration
public class A {
// 把 类 声明为 一个bean
@Bean
public B b(){
return new C(d());// 构造注入的方式 建立 联系
}
@Bean
public B d(){
return new D();
}
}
ApplicationContext
ApplicationContext 负责对象的创建和组装。有多种对其实现类,主要区别是加载方式不同。
ClassPathXmlApplicationContext
用于 加载位于应用程序类路径下的一个或多个XML 配置文件。
public class A{
public static void main(){
// 加载 ApplicationContext
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("META-INF/spring/... .xml");
// 获取bean
B b = context.getBean(B.class);// 括号 中 为 bean 的ID
// 使用 bean
b.getXXX();
context.close();
}
}
切面
面向切面编程(AOP),允许你把遍布应用各处的功能分离出来形成可重用的组件。
以声明的方式将它们应用到它们需要影响的组件中去,所造成的结果就是这些组件会具有更高的内聚性并且会更加关注自身的业务。
AOP 应用
// 会被 安排为 切面
public class A{
public void before(){
System.out.println("-----> before");
}
public void after(){
System.out.println("-----> after");
}
}
public class B {
// 会被 安排 为 切点
public void b(){
System.out.println("----> B"):
}
}
具体的切面配置
<beans ....>
<bean id="a" class="A" />
<aop:config>
<aop:aspect ref="a">
<!-- 声明切点-->
<aop:pointcut id="d" expression="execution(* *.b(...))" />
<!-- 前置通知-->
<aop:before pointcut-ref="d" method="before" />
<!-- 后置通知-->
<aop:after pointcut-ref="d" method="after" />
</aop:aspect>
</aop:config>
</beans>
把 类 声明为 bean 。<aop:aspect>
引用此 bean
模板
Spring 旨在通过模板封装来消除样板式代码。如连接数据库的 jdbcTemplate
。
bean 容器
容器是spring框架的核心。spring 容器使用DI 管理构成应用的组件,他会创建相互协作的组件之间的关联。
beanFactory 是最简单的容器,提供基本的DI支持。
ApplicationContext 基于 beanFactory 构建,并提供框架级别的服务。
常见 ApplicationContext
- AnnotationConfigApplicationContext : 从 Java 配置类中加载 ApplicationContext。
- AnnotationConfigWebApplicationContext: 从Java配置类中 加载 web ApplicationContext
- ClassPathXmlApplicationContext : 从类路径下的 xml 中加载 ApplicationContext
- FileSystemXmlApplicationContext: 从文件系统下 的xml 中加载 ApplicationContext
- XmlWebApplicationContext : 从Web应用下的 xml 中加载 ApplicationContext
getBean() 方法从 bean 容器中 获取 bean。
bean 的声明周期
- Spring 对 bean 进行实例化
- spring 将值和bean的引用注入到 bean 对应的属性中
- 如果 bean 实现了 BeanNameAware 接口,Spring 将 Bean 的id 传递给 setBeanName() 方法。
- 如果bean 实现了 BeanFactoryAware 接口,Spring将调用 setBeanFactory() 方法,将beanFactory容器实例传入。
- 如果 bean 实现了 ApplicationContextAware 接口,Spring 将调用 setApplicationContext() 方法,将 bean 所在的应用上下文的引用传入进来。
- 如果 bean 实现了 BeanPostProcessor 接口,spring 将调用 它们的 postProcessBeforeInitialization() 方法。
- 如果 bean 实现了 InitializingBean 接口,Spring 将调用 afterPropertiesSet()方法。类似地,如果bean 使用 initMethod 声明了初始化方法,该方法会被调用。
- 如果 bean 实现了 BeanPostProcessor 接口,spring 将调用 它们的 postProcessAfterInitialization() 方法。
- 此时,bean 已经准备就绪,可以被应用程序使用了,一直驻留在ApplicationContext 中,直到 ApplicationContext 被销毁。
10.如果 bean 实现 了 DisposableBean 接口,Spring 调用它的 destroy() 方法
特性
@RequestMappingProduces
和consumes
属性,用于匹配请求中的Accept 和 Content-Type 头部信息。
@RequestPart
注解用于将multipart 请求中的某些部分绑定到处理器的方法参数中。
ResponseEntityExceptionHandler 用来代替 DefaultHandlerException,前一个返回ResponseEntity<Object>
而不是 ModelAndView。