10.4.7 配置业务层组件

10.4.7 配置业务层组件

随着系统逐渐增大,系统中的各种组件越来越多,如果将系统中的全部组件都部署在同一个配置文件里,则必然导致配置文件非常庞大,难以维护。因此,我们推荐将系统中各种组件分模块、分层进行配置,从而提供更好的可维护性。
对于本系统,因为系统规模较小,故没有将系统中的组件分模块进行配置,但我们将业务逻辑组件和DAO组件分开在两个配置文件中进行管理。
因为业务逻辑组件涉及事务管理,所以在业务逻辑组件配置文件里配置了业务逻辑组件数据源事务管理器事务拦截器MailSenderMailMessage等组件。
具体的配置文件如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?xml version="1.0" encoding="utf-8"?>
<!-- Spring配置文件的根元素,并指定Schema信息 -->
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd">

<!-- 配置Hibernate的局部事务管理器,使用HibernateTransactionManager类 -->
<!-- 该类实现PlatformTransactionManager接口,是针对Hibernate的特定实现 -->
<!-- 配置HibernateTransactionManager时需要依注入SessionFactory的引用 -->
<bean
id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory" />

<!-- 定义JavaMailSenderImpl,它用于发送邮件 指定发送邮件的SMTP服务器地址, 指定登录邮箱的用户名、密码 -->
<bean
id="mailSender"
class="org.springframework.mail.javamail.JavaMailSenderImpl"
p:host="smtp.163.com"
p:username="spring_test"
p:password="123abc">
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.timeout">25000</prop>
</props>
</property>
</bean>

<!-- 定义SimpleMailMessage Bean,它代表了一份邮件 指定发件人地址,指定邮件标题 -->
<bean
id="mailMessage"
class="org.springframework.mail.SimpleMailMessage"
p:from="spring_test@163.com"
p:subject="竞价通知" />
<!-- 配置业务逻辑组件 , 为业务逻辑组件注入所需的DAO组件 -->
<bean
id="auctionService"
class="org.crazyit.auction.service.impl.AuctionServiceImpl"
p:userDao-ref="auctionUserDao"
p:bidDao-ref="bidDao"
p:itemDao-ref="itemDao"
p:kindDao-ref="kindDao"
p:stateDao-ref="stateDao"
p:mailSender-ref="mailSender"
p:message-ref="mailMessage" />

<!-- 定义执行任务调度的线程池 -->
<task:scheduler
id="myScheduler"
pool-size="20" />
<!-- 对指定Bean的指定方法执行实际的调度 -->
<task:scheduled-tasks scheduler="myScheduler">
<task:scheduled
ref="auctionService"
method="updateWiner"
fixed-delay="86400000" />
</task:scheduled-tasks>

<!-- 配置事务切面Bean,指定事务管理器 -->
<tx:advice
id="txAdvice"
transaction-manager="transactionManager">
<!-- 用于配置详细的事务语义 -->
<tx:attributes>
<!-- 所有以'get'开头的方法是read-only的 -->
<tx:method
name="get*"
read-only="true"
timeout="8" />
<!-- 其他方法使用默认的事务设置 -->
<tx:method
name="*"
timeout="5" />
</tx:attributes>
</tx:advice>

<aop:config>
<!-- 配置一个切入点,匹配指定包下所有以Impl结尾的类执行的所有方法 -->
<aop:pointcut
id="auctionPc"
expression="execution(* org.crazyit.auction.service.impl.*Impl.*(..))" />
<!-- 指定在leeService切入点应用txAdvice事务切面 -->
<aop:advisor
advice-ref="txAdvice"
pointcut-ref="auctionPc" />
</aop:config>
</beans>

各种组件依赖通过配置文件设置,由容器管理其依赖,从而实现系统的解耦。