Spring 框架-Bean
一、核心架构
1、Spring核心容器:core container
2、AOP思想:Aspects
3、Web开发:Spring Mvc
4、数据访问: Data Access、Data Integration(数据集成)
二、操作
1、xml配置
SpringConfig.xml
配置注入对象
(name : 别名配置 空格 逗号 分号 scope: prototype=多例 singleton =单例)
#默认单例:方便管理, 节省资源
#适合给容器管理的: 没有状态的对象(表现层 业务层 数据层 工具)
#不适合容器管理的: 有状态的对象(Bean对象) --每个对象都不一样
(ref :引用类型, value:简单类型) 依赖注入对象名称
#面试题目: bean作用范围: singleton prototype request session application websocket
<bean id="bookDao" class="com.newhand.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.newhand.service.impl.BookServiceImpl" scope="singleton">
<property name="bookDao" ref="bookDao" />
</bean>
2、实例化Bean三种方法
1、 构造方法
<bean id="bookService" class="com.newhand.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
<constructor-arg name="number" value="20"/>
</bean>
public BookDaoImpl() {
System.out.println("调用构造参数方法");
}
2、静态工厂
<bean id="bookDao" class="com.newhand.factory.StaticBookFactory" factory-method="getBookDao"/>
public class StaticBookFactory {
public static BookDao getBookDao() {
System.out.println("StaticBookFactory dao");
return new BookDaoImpl();
}
}
3、实例工厂
<bean id="instanceBookFactory" class="com.newhand.factory.InstanceBookFactory"/>
<bean id="bookDao" factory-bean="instanceBookFactory" factory-method="getBookDao"/>
public class InstanceBookFactory {
public BookDao getBookDao() {
System.out.println("BookFactory dao");
return new BookDaoImpl();
}
}
FactoryBean
<bean id="bookDao" class="com.newhand.factory.MyBeanFactory"/>
public class MyBeanFactory implements FactoryBean {
@Override
public Object getObject() throws Exception {
System.out.println("MyBeanFactory BookDao");
return new BookDaoImpl();
}
@Override
public Class<?> getObjectType() {
return null;
}
}
面试题: 如何解决Bean的循环依赖问题?
3、依赖注入方式
1、向一个类传递数据的方式: 普通Setter方法、构造方法
2、依赖注入的类型: 引用类型、简单类型
3、相互组合为4种方法
xml构造函数构造三种写法:
1、name 2、type 3、index
<!-- 使用Set方法注入-->
<bean id="bookDao" class="com.newhand.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.newhand.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
<property name="number" value="10"/>
</bean>
<!-- 使用构造函数注入-->
<bean id="bookDao" class="com.newhand.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.newhand.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
<constructor-arg name="number" value="20"/>
</bean>g name="number" value="20"/>
</bean>
依赖注入方式选择
1、强制依赖 - 构造器构造 不写就报错
2、可选依赖 - Setter 灵活
3、Spring倡导- 构造器构造
4、有必要两者都用
5、实际开发 Setter
6、自己开发 推荐使用Setter
4、依赖自动装配
Ioc容器根据Bean依赖资源等自动查找并注入到Bean种
1、自动装配方式:
*按类型(byType) – 保障容器中相同类型的Bean唯一,推荐
按名称(byName-要求名称一致)
按构造方法
不启用自动装配
2、配置项
3、依赖自动装配特征
自动装配优先级低于Setter与构造器注入,与以上两种方式同时出现自动装配配置失效
5、集合注入
public class ResourceServiceImpl implements ResourceService {
private String[] array;
private List<String> list;
private Set<String> set;
private Map<String, String> map;
private Properties properties;
public void setArray(String[] array) {
this.array = array;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public String toString() {
return "ResourceServiceImpl{" +
"array=" + Arrays.toString(array) +
", list=" + list +
", set=" + set +
", map=" + map +
", properties=" + properties +
'}';
}
}
<bean id="resourceService" class="com.newhand.service.impl.ResourceServiceImpl">
<!--数组-->
<property name="array">
<array>
<value>array1</value>
<value>array2</value>
<value>array3</value>
</array>
</property>
<!--List-->
<property name="list">
<list>
<value>list1</value>
<value>list2</value>
<value>list3</value>
<value>list4</value>
</list>
</property>
<!--Set-->
<property name="set">
<set>
<value>value1</value>
<value>value1</value>
<value>value1</value>
<value>value2</value>
<value>value3</value>
</set>
</property>
<!--Map-->
<property name="map">
<map>
<entry key="key1" value="value1"/>
<entry key="key2" value="value2"/>
<entry key="key3" value="value3"/>
</map>
</property>
<!--Properties-->
<property name="properties">
<props>
<prop key="proKey1">value1</prop>
<prop key="proKey2">value2</prop>
<prop key="proKey3">value3</prop>
</props>
</property>
</bean>
6、生命周期
从创建到消亡的完整过程
Bean的生命周期:从创建到销毁
初始化容器
1、创建对象 2、执行构造方法 3、执行属性注入(set)4、执行Bean初始化方法
使用Bean
1、执行业务操作
关闭/销毁容器
1、执行Bean销毁方法
Bean生命周期控制: 在Bean创建后到销毁前的一些事情
(1)
public class BookDaoImpl implements BookDao{
//创建
public void init(){
System.out.println("init");
}
//销毁
public void destroy(){
System.out.println("destroy");
}
}
<!-- SpringContext.xml -->
<bean id="bookDao" name="bookDao" class="com.newhand.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
(2) 实现InitializingBean、DisposableBean接口
实现afterPropertiesSet() destroy()方法
public class BookDaoImpl implements BookDao, InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("init");
}
@Override
public void destroy() throws Exception {
System.out.println("Destroy");
}
}
7、Spring容器创建与销毁
//1、创建容器
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("springContext.xml");
//2、销毁容器
//手工关闭容器
ctx.close();
//注册关闭容器
ctx.registerShutdownHook();
8、Pom文件
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.25.RELEASE</version>
</dependency>
</dependencies>
三、常见报错
1、NoSuchBeanDefinitionException: No bean named ‘bookServsice’ available
解决方案: 检查调用以及注入的对象名称