使用场景:直接通过类默认构造器创建对象
实现步骤:
<bean id="book01" class="cn.cjxy.ioc_bean.domain.Book"/>
代码说明:
id
:Bean 的唯一标识符class
:指定类的全限定名使用场景:需要工厂类处理复杂初始化逻辑时
实现步骤:
// 工厂类
public class BookFactory {
public Book createBook() {
return new Book("001", "Factory Book", 99.9);
}
}
<bean id="bookFactory" class="cn.cjxy.ioc_bean.factory.BookFactory"/>
<bean id="book02" factory-bean="bookFactory" factory-method="createBook"/>
代码说明:
factory-bean
指向工厂实例factory-method
指定创建方法使用场景:不需要工厂实例时的高效创建方式
实现步骤:
public class BookStaticFactory {
public static Book createBook() {
return new Book("002", "Static Book", 88.8);
}
}
<bean id="book03" class="cn.cjxy.ioc_bean.factory.BookStaticFactory"
factory-method="createBook"/>
代码说明:
使用场景:需要精细控制 Bean 创建过程时
实现步骤:
public class BookFactoryBean implements FactoryBean<Book> {
@Override
public Book getObject() {
return new Book("003", "FactoryBean Book", 77.7);
}
@Override
public Class<?> getObjectType() {
return Book.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
<bean id="book04" class="cn.cjxy.ioc_bean.factory.BookFactoryBean"/>
代码说明:
参数匹配方式:
<bean id="book05" class="cn.cjxy.ioc_bean.domain.Book">
<constructor-arg name="id" value="001"/>
<constructor-arg name="name" value="《论语》"/>
<constructor-arg name="price" value="28.9"/>
bean>
<bean id="book06" class="cn.cjxy.ioc_bean.domain.Book">
<constructor-arg index="0" value="002"/>
<constructor-arg index="1" value="《大学》"/>
<constructor-arg index="2" value="33.9"/>
bean>
标准方式:
<bean id="book08" class="cn.cjxy.ioc_bean.domain.Book">
<property name="id" value="004"/>
<property name="name" value="《孟子》"/>
<property name="price" value="22.3"/>
bean>
配置优化:
<beans xmlns:p="http://www.springframework.org/schema/p">
<bean id="book09" class="cn.cjxy.ioc_bean.domain.Book"
p:id="005" p:name="《狂人日记》" p:price="88.8"/>
对象嵌套处理:
<bean id="emp01" class="cn.cjxy.ioc_bean.domain.Emp">
<property name="dept.id" value="001"/>
<property name="dept.name" value="研发部"/>
bean>
<bean id="dept01" class="cn.cjxy.ioc_bean.domain.Dept">
<property name="id" value="002"/>
<property name="name" value="销售部"/>
bean>
<bean id="emp02" class="cn.cjxy.ioc_bean.domain.Emp">
<property name="dept" ref="dept01"/>
bean>
null 值处理:
<bean id="emp03" class="cn.cjxy.ioc_bean.domain.Emp">
<property name="dept">
<null/>
property>
bean>
集合类型处理:
<bean id="dept04" class="cn.cjxy.ioc_bean.domain.Dept">
<property name="empList">
<list>
<ref bean="emp01"/>
<ref bean="emp02"/>
list>
property>
bean>
<bean id="book11" class="cn.cjxy.ioc_bean.domain.Book">
<property name="maps">
<map>
<entry key="id" value="005"/>
<entry key="name" value="《小时代》"/>
map>
property>
bean>
public class Person {
// 初始化方法
public void init() {
System.out.println("Bean初始化完成");
}
// 销毁方法
public void destroy() {
System.out.println("Bean即将销毁");
}
}
<bean id="person01" class="cn.cjxy.ioc_bean.domain.Person"
init-method="init" destroy-method="destroy"/>
执行流程:
<bean id="person02" class="cn.cjxy.ioc_bean.domain.Person"
scope="prototype"
lazy-init="true"/>
属性 | 可选值 | 说明 |
---|---|---|
scope | singleton/prototype | 单例(默认) vs 多例 |
lazy-init | true/false | 是否延迟初始化(默认false) |
<context:property-placeholder location="classpath:config.properties"/>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="jdbcUrl" value="${db.url}"/>
<property name="username" value="${db.user}"/>
bean>
<context:component-scan base-package="cn.cjxy.ioc_bean"/>
public class SpringTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取单例Bean
Book book1 = context.getBean("book01", Book.class);
// 获取原型Bean
Person person = context.getBean("person02", Person.class);
context.close(); // 触发destroy方法
}
}
输出示例:
创建了...... // 构造器输出
初始化了...... // init-method
销毁了...... // destroy-method
通过以上优化架构,可以实现:
实际开发中建议结合注解方式(@Component, @Autowired)进行混合配置,提升开发效率。