Spring Bean的基础配置与实例化详解

Spring Bean的基础配置与实例化详解

一、Bean的基础配置

1. Bean基础配置

在Spring中,Bean的基础配置是通过XML文件或Java注解来完成的。以下是通过XML文件配置Bean的示例:

<beans>
    <bean id="myBean" class="com.example.MyClass">
        <property name="propertyName" value="propertyValue"/>
    </bean>
</beans>

在Java注解方式中,可以使用@Component@Service@Repository@Controller注解来定义Bean:

@Component
public class MyClass {
    @Value("propertyValue")
    private String propertyName;
}
2. Bean别名配置

为了方便管理和引用Bean,Spring允许为Bean配置别名。配置别名可以通过alias标签来实现:

<bean id="myBean" class="com.example.MyClass"/>
<alias name="myBean" alias="myBeanAlias"/>

在代码中,可以通过别名获取Bean实例:

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
MyClass myBean = (MyClass) ctx.getBean("myBeanAlias");
3. Bean作用范围配置

Spring提供了多种Bean作用范围(Scope)配置,决定了Bean的生命周期和可见性。常见的作用范围包括:

  • singleton(默认):整个Spring IoC容器中只有一个Bean实例。
  • prototype:每次请求都会创建一个新的Bean实例。
  • request:每个HTTP请求都会创建一个新的Bean实例,仅适用于Web应用。
  • session:每个HTTP会话都会创建一个新的Bean实例,仅适用于Web应用。
  • globalSession:全局HTTP会话,通常仅在Portlet应用中使用。
  • application:在ServletContext范围内创建一个单例Bean。
  • websocket:在WebSocket范围内创建一个单例Bean。

以下是一些示例配置:

<!-- 单例Bean -->
<bean id="singletonBean" class="com.example.SingletonBean" scope="singleton"/>

<!-- 多例Bean -->
<bean id="prototypeBean" class="com.example.PrototypeBean" scope="prototype"/>

<!-- Request作用域 -->
<bean id="requestBean" class="com.example.RequestBean" scope="request"/>

<!-- Session作用域 -->
<bean id="sessionBean" class="com.example.SessionBean" scope="session"/>

二、Bean的实例化

Spring提供了多种实例化Bean的方式,包括构造方法、静态工厂方法和实例工厂方法。

1. 构造方法实例化Bean

通过构造方法实例化Bean是最常见的方式。以下是通过构造方法实例化Bean的示例:

public class BookDaoImpl implements BookDao {
    public BookDaoImpl() {
        System.out.println("book dao constructor is running ....");
    }
    public void save() {
        System.out.println("book dao save ...");
    }
}

在XML配置文件中:

<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl"/>
2. 静态工厂实例化Bean

通过静态工厂方法实例化Bean也是一种常见的方式。以下是通过静态工厂方法实例化Bean的示例:

public class OrderDaoFactory {
    public static OrderDao getOrderDao() {
        System.out.println("factory setup....");
        return new OrderDaoImpl();
    }
}

在XML配置文件中:

<bean id="orderDao" class="com.example.factory.OrderDaoFactory" factory-method="getOrderDao"/>
3. 实例工厂实例化Bean

通过实例工厂方法实例化Bean也是一种常见的方式。以下是通过实例工厂方法实例化Bean的示例:

public class UserDaoFactory {
    public UserDao getUserDao() {
        return new UserDaoImpl();
    }
}

在XML配置文件中:

<bean id="userFactory" class="com.example.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>

三、Bean的生命周期

1. Bean生命周期控制

在Spring中,可以通过配置初始化方法和销毁方法来控制Bean的生命周期。以下是一个示例:

public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
    // 表示bean初始化对应的操作
    public void init() {
        System.out.println("init...");
    }
    // 表示bean销毁前对应的操作
    public void destroy() {
        System.out.println("destroy...");
    }
}

在XML配置文件中:

<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
2. Bean销毁时机

Bean的销毁通常在Spring容器关闭时发生,可以通过手动关闭容器或注册关闭钩子来触发销毁方法:

public class AppForLifeCycle {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
        // 注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
        ctx.registerShutdownHook();
        // 手动关闭容器
        // ctx.close();
    }
}

四、依赖注入(DI配置)

1. 依赖注入方式

Spring支持两种主要的依赖注入方式:Setter注入和构造器注入。

1.1 Setter方式注入

Setter方式注入可以用于注入简单类型和引用类型:

public class BookDaoImpl implements BookDao {
    private int connectionNumber;

    public void setConnectionNumber(int connectionNumber) {
        this.connectionNumber = connectionNumber;
    }

    // 其他方法...
}

在XML配置文件中:

<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl">
    <property name="connectionNumber" value="10"/>
</bean>
1.2 构造器方式注入

构造器方式注入也可以用于注入简单类型和引用类型:

public class BookDaoImpl implements BookDao {
    private int connectionNumber;

    public BookDaoImpl(int connectionNumber) {
        this.connectionNumber = connectionNumber;
    }

    // 其他方法...
}

在XML配置文件中:

<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl">
    <constructor-arg name="connectionNumber" value="10"/>
</bean>
2. 依赖自动装配

Spring支持自动装配Bean的依赖,可以通过autowire属性配置自动装配类型:

  • byName:根据属性名自动装配。
  • byType:根据属性类型自动装配。
  • constructor:通过构造器自动装配。
  • autodetect:Spring会尝试使用constructorbyType进行自动装配。

以下是一个按类型自动装配的示例:

<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.example.service.impl.BookServiceImpl" autowire="byType"/>
  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小林学习编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值