配置好的bean可以直接通过spring的 上下文 获取。 而配置只用告诉spring,一个 xml文件 的路径,spring就会基于这个xml生成一个对应的 context
对象。 类似 Bean b = context.getBean("Bean.id")
.
class 具体要实例化的类
scope 范围/作用域
constructor arg 构造器参数
properties 属性
Autowiring mode 自动装配的方式
lazy-initialization mode
initialization/destruction method
<beans> <bean id="oneInterface" class="com.tuo.interface.OneInterfaceImpl"></bean> </beans> 复制代码
扫描的策略需要在xml中配置。 可以指定扫描的包,还可以添加一些过滤器,实现更细致的扫描策略。 以下四个注解去注解的类都会被扫描并发现为Bean并注册到IoC容器中。
<context:component-scan base-package="com.tuo.bean"/> 复制代码
@Component 元注解 用元注解去注解一个注解,这个注解也可以被自动发现 通用注解,可作用于任何bean
@Repository 通常用于注解DAO类,即持久层
@Service 通常用于注解Service类,即服务层
@Controller 通常用于注解Controller类,即控制层(mvc)
@Scope可以注解一个bean指定它的作用域,默认为 singleton
还有一些其他的注解可以看源码学习, @Configuration
@Bean
@Import
@DependsOn
。
全局:
<beans ... ... ... default-init-method="init" default-destroy-method="destroy"> </beans> 复制代码
具体类:
org.springframework.beans.factory.InitializingBean
接口, 覆盖 afterPropertisSet
方法 init-method
方法 org.springframework.beans.factory.DisposableBean
接口, 覆盖 destory
方法 destory-method
方法 自动装配相较于普通的 设值注入和构造注入 ,xml文件的bean配置更为简单,bean定义中也不需要写set方法/构造方法。 只需在bean中配置 Autowiring mode
, 或者配置全局的 default-autowire
.
它是一个 接口 。
public interface ResourceLoader{ Resource getResource(String location); } 复制代码
spring
中所有 application contexts
都实现了这个接口。 都可以当成 ResourceLoader
来用。 都可以获取到 Resource
的实例。
前缀:
@Required 适用于setter方法上,仅仅表示这个属性必须在配置的时候填充一个确定值,可以是bean 标签的配置,也可以是自动装配。
@Autowired 适用于setter方法、构造方法、和成员变量。与 @Requred
效果类似。
默认情况下,如果找不到合适的bean来注入属性,将会导致autowiring失败并抛出异常。可以通过 @Autowired(required=false)
来避免.
每个类只有一个构造器可以被注解为 @Autowired(required=true)
.
@Autowired
的必要属性建议使用传统的 @Required
.
常用于注解那些众所周知的解析依赖性接口,比如: BeanFactory
, ApplicationContext
, ResourceLoader
还可以实现数组或Map的自动注入。
包依赖:
org.springframework.beans org.springframework.context
核心类:
BeanFactory ApplicationContext
FileSystemXmlAppliactionContext context = new FileSystemXmlAppliactionContext("F:xx/xx.xml")
ClasspathXmlAppliactionContext context = new ClasspathXmlAppliactionContext("classpath:spring-context.xml")
org.springframework.web.context.ContextLoaderListener/Servlet
当需要一个对象时,不自己去创建这个对象,而是向spring 申请 ,从 IoC容器 中拿一个出来用。
<property name="injectionDAO" ref="injectionDAO"/> 复制代码
通过调用 类的set方法 注入。
<constructor-arg name="injectionDAO" ref="injectionDAO"/> 复制代码
通过调用类的 构造函数 注入。
通过 预编译方式 和 运行期动态代理 实现程序功能的 统一维护 的技术。
预编译: AspectJ
动态代理: JDK动态代理 、 CGLib
切面 Aspect:一个 关注点 的模块化,可能会 横切 多个对象
连接点 Joinpoint : 程序执行过程中的某个特定的点
通知 Advice : 在切面的某个特定的连接点执行的 动作
切入点 Pointcut: 匹配连接点的断言 ,在AOP中通知和一个切入点表达式关联
引入 Introduction:在 不修改类代码 的前提下,为类 加新的方法和属性 。可能是借助预编译时修改字节码,如AspectJ
目标对象 Target Object, 被一个或多个切面 所通知的对象 。
AOP代理 AOP Proxy: AOP框架 创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)
织入 Weaving: 把切面 连接 到其他的应用程序类型或者对象上,并创建一个被通知的对象,分为: 编译时织入、类加载时织入、执行时织入
AOP主要提供的都是一些和 核心业务功能 关联并不大的 辅助功能 ,拿日志记录一点来说,只需在适当的位置前/后插入记录日志相关的代码。那么每个需要日志记录的关键点,也就是AOP里的 切入点Pointcut , 都需要 前后插入这些代码 ,也就是执行相关的动作( 通知 Advice )。这将是很大的工作量。那么我们可以将这些和核心功能关联不大的功能, 单独做成模块 ,这就是一个 切面 。 切面 是我们开发中同样重要的、 垂直于核心功能 的一个 关注点 。那么我们的切面准备好了以后,如何应用于核心业务功能呢? 这就需要用到Spring AOP提供框架来进行合适的 引入 。主要有以下几种引入方式:
编译期的AOP, 检查 代码并 匹配 连接点与切入点的代价是高昂的,应当尽量定义良好的切入点。
Spring AOP 默认的代理模式,使用JAVA API,使得任何接口(或者接口集)都可以被代理。