》 常见 属性的说明
>depend-on
要求在加载此 bean 内容之前,强制初始化 (强制先加载另一个Bean
<bean id="a" class="com.kgc.ioc.type.A" depends-on="api01" >
>lazy-init
lazy 【延迟加载 | 懒汉模式 | 饥汉模式】
1. 延迟加载 : 啥时候用到它 再加载
2. 延迟到啥时候 ?: 啥时候用到它 再加载
3. 延迟加载 体现的思想 : 以空间换时间
lazy-init="true" <!-- 添加lazy-init 延迟加载 -->
一个一个 配置 太麻烦 :给一个全局配置
default-lazy-init ="true"
>default-lazy-init 修改默认配置
注意 : 延迟初始化 只对 singleton bean 起作用
》 自动装配
4 种 装配类型
1. no :最常用的 可读性高
2. byName
3. byType
4. constractor 按构造方法匹配
> 是根据类型进行匹配的 > 如果没有匹配上的,则报错
> 如果有多个匹配上的 则报错
<!-- 属性中 加入 autowire="byName"、"byType"、"constractor" -->
<!-- <property name="implOne" ref="implOne"></property> -->
<bean id="client" class="com.kgc.ioc.autoWired.Client" autowire="byName"></bean>
<bean id="implOne" class="com.kgc.ioc.autoWired.AutoWiredImplOne"></bean>
注意构造方法的 使用
// 构造方法只在 constractor 按构造方法匹配 时需要, byName byType 时不需要
public Client(AutoWiredApi implOne){
this.implOne = implOne;
}
注意:1. 如果整个项目组命名非常规范,byName 是不错的选择 可以设置 配置文 default-autowired=””
不易维护: 自动装配使得配置文件非常简洁,但同时也造成组件之间依赖关系不明确,容易发生一些潜在的错误,在实际项目中谨慎使用
2.小型项目上 ,配置文件不多,一定不会因为人为原因出现类型重复
其他内容 补充
》 方法 注入 lookup-method
主要应用场景 : 希望向单例对象中加入 原型对象的时候引用
底层实现: 是通过CGLIB 进行动态生成 子类实现的
<bean id="one" class="com.kgc.ioc.method.MethodDemoOne" scope="singleton">
<lookup-method name="getTwo" bean="two"/>
</bean>
<bean id="two" class="com.kgc.ioc.method.MethodDemoTwo" scope="prototype"></bean>
MethodDemoOne中定义了 一个抽象方法 通过方法 注入 实现
private MethodDemoTwo two;
public abstract MethodDemoTwo getTwo();
public void setTwo(MethodDemoTwo two) {
this.two = two;
}
》 bean 的生命周期
初始化 管理 1、实现 InitializingBean 接口
public class LifeCycleDemo implements InitializingBean {
在实例初始化 以后回调的方法
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("this is init method!");
}
}
2、使用 init-method 标签
<!-- 演示生命周期管理 -->
<bean id="lifeCycle" class="com.kgc.ioc.lifecycle.LifeCycleDemo"
init-method="init"
></bean>
public void init(){
System.out.println("this is diy init");
}
销毁 管理 1、实现 DisposableBean 接口
2、使用 destorsy-method 标签
》国际化
format.properties 的配置
kgc1=v1
kgc2=\u6211\u7231\u8BFE\u5DE5\u573A {0}--{1}
在配置文件中 加入 message 支持
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>format</value>
</list>
</property>
</bean>
通过ApplicationContext 的实例进行读取
getMessage (4个参数)
ApplicationContext atc = new ClassPathXmlApplicationContext("applicationContext-national.xml");
// 第一个参数 :要获取的内容的 key
// 第二个参数 :待传入的值
// 第三个参数 : 默认值
// 第四个参数 : 指定的语言
String message = atc.getMessage("kgc2", new Object[]{"kgc","万岁"}, "default", Locale.CHINA);
System.out.println("message = "+message);
》事件
1、ContextRefreshedEvent
当IoC 容器 初始化或刷新 的时候调用的事件
2、ContextCloseEvent
IoC容器 被关闭的时候调用的事件
3、requestHandleEvent
当http事件 被响应的时候 发出的事件
》访问资源
Spring 给我们提供了一个Resource 接口来帮助我们 访问资源
<bean id="resource" class="com.kgc.ioc.resource.MyResource">
<property name="resource" value="applicationContext-resource.xml"></property>
</bean>
实例以文件读取为主
private Resource resource;
public void setResource(Resource resource) {
this.resource = resource;
}
》全注解 @interface
三类:
- 元注解
- @override
- @SuppressWarnings
2.自定义注解
- @interface
3.其他注解
- Spring提供的注解
Spring 注解的作用
注册Bean
- @Conttroller
- @Service
- @Repository
- @Comport
注入bean
- @Autowired
> 使用步骤
1、先开启注解支持
<!-- 开启注解 -->
<context:component-scan base-package="com.kgc.ioc.anno"></context:component-scan>
2、注册两个 bean
@Service("beanA")
public class BeanA {
@Autowired
private BeanB b;
// 写一个Setter 方法
public static void main(String[] args) {
ApplicationContext atc = new ClassPathXmlApplicationContext("applicationContext-anno.xml");
BeanA a = (BeanA)atc.getBean("beanA");
a.b.run();
}
}
标签最后一步 加
@Service("beanB")
public class BeanB {
public void run(){
System.out.println("BeanB method");
}
}
3、将一个 bean 注入到另一个 bean