定义各种bean,然后供ClasspathXmlApplicationContext对象去解析(初始化各种定义的bean,并交由IOC容器去管理)。
<context:component base-package="..." />:Spring启动时会查找指定包及其子包下的各种带有@Component,Controller,@Service,Repository注解的类,将其初始化并加入到容器当中,该配置还会创建Spring内置的4个bean,用于处理@Autowired注解等,所以加上了这个配置才能使用相关的注解。
<aop:aspectj-autoproxy />:自动为spring容器中那些配置@AspectJ切面的bean创建代理对象,织入切面,启用Spring对AspectJ注解编程的支持。
<bean id="userService" class="com.bundery.userService" scope="singleton">
<property name="userDAO" ref="userDAO">
</bean>默认情况下,当容器创建创建的时候(new ClassPathXmlApplicationContext("classpath:applicationContext.xml")),就会初始化配置的bean,但是如果配置了<bean id="..." class="..." lazy-init="true"/>,就会等到第一次用到该bean的时候才初始化。
当配置了<bean id="..." class="..." init-method="init" destory-method="destory"/>,会在bean创建的时候的自动调用init方法,容器结束时调用destory方法。
- scope=
"singleton"每次使用bean时,只会在第一次调用init方法, 容器结束时,调用destory方法。 - scope=
"prototype"每次使用bean时,每次都会先调用init方法,容器结束时,不会调用destory方法。
Spring需要配置dataSource数据库连接池的bean,来获取数据库的连接参数以及数据库Connection。
<!-- 配置dbcp2数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>当与Hibernate框架相结合时,需要使用配置SessionFactory的bean,因为Hibernate的数据的持久化等都是通过Session来完成的,SessionFactory中需要注入dataSource获取数据库连接的相关信息。
<!-- 配置Hibernate5的SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" /><!-- 注入连接池 -->
<property name="packagesToScan" value="io.bundery.model" /><!--
扫描@Entity注解类 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL55Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop><!-- 有表自动更新表结构,没有就创建表 -->
</props>
</property>
</bean>以下例子是配置Hibernate5提供的事务管理器,需要注入SessionFactory,因为事务管理器需要获取Session。原理本质上就是在被Spring事务管理的bean的方法前加上Trancaction tx=session.beginTransaction();,方法后加上tx.commit(),所以DAO层获取session一定要使用sessionFactory.getCurrentSession()(因为在当前上下文中获得的是同一个session)。
<!-- 配置Hibernate的事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" /><!-- 注入SessionFactory -->
</bean><tx:annotation-driven transaction-manager="transactionManager" />该配置用于启用注解@Trancational来管理事务。