-
·Spring的工厂类
可以使用FileSystemXmlApplicationContext来读取磁盘上的配置文件
BeanFactory是调用getBean方法时才实例化对象 而 ApplicationContext是一加载配置文件就实例化对象
-
·Spring的Bean管理(XML方式)
三种实例化Bean的方式
-
-
使用构造器实例化(默认无参数)
-
Bean1
public class Bean1 { public Bean1(){ System.out.println("Bean1被创建了"); } }
配置文件中
<!-- 第一种,无参构造器的方式--> <bean id="Bean1" class="com.windbag.ioc.demo2.Bean1"></bean>
-
-
使用静态工厂方法实例化(简单工厂模式)
-
Bean2
public class Bean2 { }
Bean2Factory
public class Bean2Factory { public static Bean2 createBean2(){ System.out.print("Bean2Factory的方法已经执行了"); return new Bean2(); } }
配置文件
<!-- 第二种:静态工厂的方式--> <bean id="Bean2" class="com.windbag.ioc.demo2.Bean2Factory" factory-method="createBean2"></bean>
-
-
使用动态工厂方法实例化(工厂方法模式)
-
Bean3
public class Bean3 { }
Bean3Factory
public class Bean3Factory { public Bean3 createBean3(){ System.out.print("Bean3Factory的方法执行了"); return new Bean3(); } }
配置文件
<!-- 第三种:实例工厂的方式--> <bean id="Bean3Factory" class="com.windbag.ioc.demo2.Bean3Factory"></bean> <bean id="Bean3" factory-bean="Bean3Factory" factory-method="createBean3"></bean>
Bean的配置
-
- ·id和name
- -一般情况下,装配一个Bean时,通过指定一个id属性作为Bean的名称
- -id 属性在IOC容器中必须是唯一的
- -如果Bean的名称中含有特殊字符,就需要使用name属性
- ·class
- -class用于设置一个类的完全路径名称,主要作用是IOC容器生成类的实例
- ·id和name
Bean的作用域
scope="prototype" 在spring整合struts2的action时候使用 scope="singleton"单例 这两个用的比较多
Bean的生命周期
- instantiate bean对象实例化
- populate properties 封装属性
- 如果Bean实现BeanNameAware 执行 setBeanName
- 如果Bean实现BeanFactoryAware 或者ApplicationContextAware 设置工厂setBeanFactory 或者上下文对象 setApplicationContext
- 如果存在类实现BeanPostProcessor(后处理Bean),执行postProcessBeforelnitialization
- 如果Bean实现InitializingBean 执行 afterPropertiesSet
- 调用<bean init-method="init">指定初始化方法init如果存在类实现BeanPostProcessor(处理Bean),执行postProcessAfterInitialization
- 执行业务处理
- 如果Bean实现DisposableBean 执行 destroy
- 调用<bean destroy-method="customerDestroy">指定销毁方法customerDestroy
- 调用<bean destroy-method="customerDestroy">指定销毁方法customerDestroy
第五步和第八步重要 后处理Bean 增强用的 也就是代理模式
-
·Spring的属性注入(XML方式)
Spring的属性注入
-
- -构造函数注入
- 通过构造方法注入Bean的属性值或依赖的对象,它保证了Bean实例在实例化后就可以使用。
构造器注入在<constructor-arg>元素里声明的属性
- 通过构造方法注入Bean的属性值或依赖的对象,它保证了Bean实例在实例化后就可以使用。
- -属性setter方法注入
- 使用set方法注入,在Spring配置文件中,通过<property>设置注入的属性 如果有对象类型的值使用ref来注入
- p命名空间
- p:<属性名>="xxx”引入常量值
p:<属性名>-ref="xxx"引用其它Bean对象
- p:<属性名>="xxx”引入常量值
- SpEL注入
- ·SpEL:spring expression language,spring表达式语言,对依赖注入进行简化
·语法:#{表达式}
·<bean id=""value=“#{表达式}">
SpEL表达式语言
语法:#}
#{‘hello'}:使用字符串
#{topicld3}:使用另一个bean
#{topicId4.content.toUpperCase0}:使用指定名属性,并使用方法
#{T(java.lang.Math).P}:使用静态字段或方法
- ·SpEL:spring expression language,spring表达式语言,对依赖注入进行简化
- -构造函数注入
-
·Spring的Bean管理(注解方式)
- 在使用前在配置文件中的头改成
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--开启注解扫描================--> <context:component-scan base-package="com.windbag.demo1"/> </beans>
-
- ·Spring2.5引入使用注解去定义Bean
- -@Component 描述Spring框架中Bean
- ·除了@Component外,Spring提供了3个功能基本和@Component等效的注解
- -@Repository 用于对DAO实现类进行标注
- -@Service 用于对Service实现类进行标注
- -@Controller 用于对Controller实现类进行标注
- ·这三个注解是为了让标注类本身的用途清晰,Spring在后续版本会对其增强
-
·Spring的属性注入(注解方式)
- ·使用@Autowired 进行自动注入
- ·@Autowired 默认按照类型进行注入
- -如果存在两个相同Bean类型相同,则按照名称注入
- ·@Autowired注入时可以针对成员变量或者set方法
- ·通过@Autowired的required属性,设置一定要找到匹配的Bean
- ·使用@Qualifier指定注入Bean的名称
- ·使用Qualifier 指定Bean名称后,注解Bean必须指定相同名称
- ·Spring提供对JSR-250中定义@Resource标准注解的支持
- ·@Resource和@Autowired注解功能相似 但是要写name=“..”
-
传统XML配置和注解配置混合使用
- ·XML方式的优势(配置Bean)
- -结构清晰,易于阅读
- ·注解方式的优势(注入属性)
- -开发便捷,属性注入方便·XML与注解的整合开发
- -1、引入context命名空间
- -2、在配置文件中添加context:annotation-config标签