配置Bean
以配置文件的形式配置Bean
在资源目录下创建.xml文件进行对Bean的配置
在创建文件之前还首先需要引入spring中spring-context的依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
在XML文件之中配置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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="deptServiceimpl" class="com.example.service.impl.DeptServiceimpl"></bean>
</beans>
然后在类中获取bean:
public static void main(String[] args) {
//获取IOC容器
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取Bean
DeptService deptServiceimpl = (DeptService) ctx.getBean("deptServiceimpl");
}
- bean别名配置
通过name属性设置多个别名
- bean作用范围的配置
- 通过静态工厂进行bean的实例化:
手写一个实例化工厂
public class OrderDaoFactory{
public static OrderDao getOrderDao(){
return new OrderDaoImpl();
}
}
再在该xml文件中引入该静态实例化bean的方法
<bean
id="orderDao"
factory-method="getOrderDao"
class="class.itheima.factory.OrderDaoFactory"
- 使用FactoryBean实例化bean
public class UserDaoFactoryBean implements FactoryBean<UserDao>{
//代替原始实例工厂创建对象的方法
public UserDao getObject() throws Exception{
return new UserDaoImpl();
}
public Class<?> getObjectType(){
return UserDao.class;
}
}
在配置文件当中xml
<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
Bean的声明周期
- 初始化容器:
- 创建对象(内存分配)
- 执行构造方法
- 执行属性注入(set操作)
- 执行bean初始化方法
- 使用bean
执行业务操作
- 关闭/销毁容器
- 执行bean的销毁方法
bean的销毁时机
容器关闭前触发bean的销毁
关闭容器方式:
ConfigurableApplicationContext接口close()操作
注册关闭钩子,在虚拟机退出前关闭容器再退出虚拟机
configurableApplicationContext接口registerShutdownHook()操作
依赖注入方式
- setter注入
简单类型,引用类型
在实体类中如何通过setter来配置属性:
public class BookDaoImpl implements BookDao{
private int connetionNum;
public void setconnetionNum(int connetionNum){
this.connetionNum=connetionNum;
}
}
在这个实体类中给出了属性对应的set方法,在对应的bean的xml中给出响应的配置即可
<bean id="bookDao" class="....">
<property name="connectionNum" value="100"/>
</bean>
这样就对简单类型做出了响应的依赖注入
- 构造器注入
简单类型,引用类型
对简单类型在实体类通过构造器进行注入:
public class BookDaoImpl implements BookDao{
private int connetionNum;
public void setconnetionNum(int connetionNum){
this.connetionNum=connetionNum;
}
}
在对应的xml文件中进行配置
<bean id="bookDao" class="....">
<constructor-arg name="bookDao" ref="bookDao"/>
</bean>
//可以
<bean id="bookDao" class="....">
<constructor-arg name="databaseName" value="mysql"/>
</bean>
注意第一个name中是构造器中的形参
但是这样进行配置会导致配置文件与代码的耦合度非常的高
我们可以略加修改:
<bean id="bookDao" class="....">
<constructor-arg type="java.long.String" value="mysql"/>
</bean>
这样就解决了文件之间的耦合问题,但是如果存在多个类型相同的参数,应该怎么办呢,我们略作修改
<bean id="bookDao" class="....">
<constructor-arg index="0" value="mysql"/>
<constructor-arg index="1" value="dad"/>
</bean>
通过参数所在的位置来进行注解能很好的改变这一问题
自动装配
通过XML文件实现对类的自动装配
<bean id="bookDao" class="...."/>
<bean id="bookService" class="..." autowire="byType"/>
通过bean中的autowire属性进行类型注入
- 依赖自动装配特征
- 自动装配用于引用型类型依赖注入,不能对简单类型进行操作
- 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
- 使用按名称装配时(byname)必须保障容器中具有相同指定名称的bean,因变量名与配置耦合,不推荐使用
- 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
集合注入
在实体类中创建集合类型的依赖注入
public class BookDaoImpl implements BookDao{
private int[] array;
private List<String> list;
public void setArray(int[] array){
this.array=array;
}
}
在xml文件中给出相应的配置:
<bean id="bookDao" class="...">
<property name="array">
<array>
<value>100</value>
<value>100</value>
</array>
</property>
</bean>
list集合的配置形式与其相同,Map的配置形式
<bean id="bookDao" class="...">
<property name="map">
<map>
<entry key="" value=""/>
</map>
</property>
</bean>
对于properties的xml配置类型如下:
<bean id="bookDao" class="...">
<property name="properties">
<props>
<prop key="">ssss</prop>
</props>
</property>
</bean>
加载properties文件
在spring中加载外部的properties文件:
需要在xml文件中开辟新的空间(命名空间)
<?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"
">
如何加载properties文件
<context:property-placeholder location="properties文件"/>
如何使用文件中的属性名:
<bean class=".....">
<property name="..." value="${文件中的属性名}">
</bean>
如何加载多份properties文件:
<context : property-placeholder location="classpath:*.properties" system-properties-mode="NEVER"/>
//从类路径或jar包中搜索并加载properties文件
<context : property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/>
后边的标签属性system-properties-mode表示不加载系统属性
容器类层次结构图
BeanFactory创建完毕后,所有的bean均为延迟加载