Spring工厂类
Spring的Bean管理(XML方式)
Spring的属性注入(XML方式)
Spring的Bean管理(注解方式)
Spring的属性注入(注解方式)
之前用的BeanFactory来完成Spring工厂类的获取,现在已经弃用,改为ApplicationContext类通过new FileSystemXmlApplicationContext()/new ClassPathXmlApplicationContext获取,却别在于FileSystemXmlApplicationContext是通过系统文件加载配置参数,ClassPathXmlApplicationContext是通过工程里面的配置文件来获取配置参数
Spring的Bean管理(XML方式) 三种实例化方式1.使用类构造器实例化(默认无参数)
2.使用静态工厂方式实例化(简单工厂模式)
3.使用实例工厂的方式实例化(工厂方法模式)
tips:通常使用无参构造器的方法,当类的实例构造特别复杂的时候,使用下面两种工厂的方式
配置文件:
使用类构造器实例化(默认无参数)
package com.imooc.ioc.demo2;
public class Bean1 {
public Bean1(){
System.out.println("Bean1被实例化了");
}
}
使用静态工厂方式实例化(简单工厂模式)
package com.imooc.ioc.demo2;
public class Bean2 {
}
package com.imooc.ioc.demo2;
public class Bean2Factory {
public static Bean2 createBean2(){
System.out.println("Bean2Factory已经执行");
return new Bean2();
}
}
使用实例工厂的方式实例化(工厂方法模式)
package com.imooc.ioc.demo2;
public class Bean3 {
}
package com.imooc.ioc.demo2;
public class Bean3Factory {
public Bean3 createBean3(){
System.out.println("Bean3Factroy方法已经被执行");
return new Bean3();
}
}
Bean配置
id和name
一般情况下,装配一个Bean的时候,通过指定一个id属性作为Bean的名称
id属性在IOC容器中必须是唯一的
如果Bean的名称中有特殊字符,则需要使用name属性
class
用来设置一个类的完全路径名称,主要作用是IOC容器生成类的实例
Bean的作用域scope属性
| 类别 | 说明 |
|---|---|
| singleton | 在SpringIOC容器中仅存在一个Bean实例,Bean以单例的方式存在,默认值 |
| prototype | 每次调用getBean1()时都会返回一个新的实例 |
| request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 |
| session | 同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean。该作用域仅适用于WebApplicationContext环境 |
Spring初始化Bean或销毁bean时,有时需要做一些处理工作,因此spring创建或销毁bean的时候调用bean的两个生命周期方法
当bean被载入到容器的时候调用setup
当bean从容器中删除的时候调用teardown(scope=singleton有效,因为多例模式中,spring不知道将哪个实例销毁)
Spring容器中Bean的生命周期1.instantiate bean对象实例化
2.populate properties 封装属性
3.如果Bean实现BeanNameAware 执行setBeanName
4.如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext
5.如果存在类实现 BeanPostProcessor(后处理Bean),执行postProcessBeforeInitialization
6.如果实现了InitializingBean 执行 afterPorpertiesSet
7.调用指定的初始化方法 init
8.如果存在类实现 BeanPostProcessor(处理Bean),执行postProcessAfterInitialization
9.执行业务处理
10.如果Bean实现 DisposableBean 执行 destory
11.调用 指定销毁方法customerDestory
package com.imooc.ioc.demo3;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MayBeanPostProcessor implements BeanPostProcessor {
public Object postProcessorBeforeInitialization(Object bean , String beanName) throws BeansException{
System.out.println("第五步:初始化前方法");
return bean;
}
public Object postProcessorAfterInitialization(final Object bean , String beanName) throws BeansException{
System.out.println("第八步:初始化后方法");
if("userDao".equals(beanName)){
Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("save".equals(method.getName())){
System.out.println("--------------权限校验-------------");
method.invoke(bean , args);
} else {
method.invoke(bean , args);
}
return null;
}
});
return proxy;
}
return bean;
}
}
Spring的属性注入
对于类成员变量,注入方式有三种
构造函数注入
属性setter方法注入
接口注入
Spring支持前两种方式 Spring的属性注入-构造方法属性注入通过构造方法注入Bean的属性值或依赖对象,它保证了Bean实例在实例化后就可以使用
构造器注入在元素里声明的属性
package com.imooc.ioc.demo4;
public class User {
private String name;
private Integer age;
public User(String name , Integer age){
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
}
Spring的属性注入-set方法注入(常用)
使用set方法注入,在Spring配置文件中,通过设置注入的属性
Spring的属性注入-p名称空间
使用p命名空间
为了简化XML文件配置,Spring从2.5开始引入一个新的p名称空间
p:<属性名>="xxx"引入常量值
p:<属性名>-ref="xxx"引用其他Bean对象
Spring的属性注入-SpEL注入
- SpEl:Spring expression language , Spring表达式语言,对依赖注入进行简化
- 语法:#{表达式}
SpEl表达式语言
语法:#{}
- #{‘hello’} : 使用字符串
- #{beanId} : 使用另一个bean
- #{beanId.content.toUpperCase()} : 使用指定名属性,并使用方法
- #{T(java.lang.Math).PI} 使用静态字段或方法



