<?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" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xmlns:amq="http://activemq.apache.org/schema/core" xmlns:jms="http://www.springframework.org/schema/jms"
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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd">
加载配置文件
<!--加载配置文件-->
<context:property-placeholder location="classpath:db2.properties"/>
<!--注解方式 在配置类上加@PropertySource("classpath:db2.propertes") -->
<!-- @PropertySource("classpath:db2.propertes") 用于指定加载配置文件的。-->
(一) Spring IOC
<!--01 xml 配置文件-->
<!--由于dao维护了一个jdbctemplate成员变量,所以需要注入-->
<bean id="jdbctemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--由于dao维护了一个jdbctemplate成员变量,所以需要注入-->
<bean id="jdbctemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 创建一个连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<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>
<bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl">
<property name="jdbcTemplate" ref="jdbctemplate"/>
</bean>
<!--02 注解方式-开启注ioc解扫描-->
<context:component-scan base-package="com.itheima"/>
<!-- 03 纯注解开发-->
<!--
创建一个配置类加上@Configuration注解,代替bean.xml配置文件。
@Configuration 该注解的作用代表了该类是一个配置类,用于取代bean.xml文件的。
@ComponentScan("com.itheima") 扫描 ioc 相关的注解的 @Respository @Service @Controller @component这些注解的 @component这些注解的
@PropertySource("classpath:db2.propertes") 用于指定加载配置文件的。
@Bean("dataSource") 方法上一旦添加 @Bean("dataSource")注解,那么该方法会自动执行,
并且把该方法的返回值存储到容器中。
-->
(二) Spring Aop
<!-- 01 xml 配置-->
<!--1. 创建目标对象与切面对象-->
<!-- 目标对象 -->
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl"/>
<!--切面对象-->
<bean id="logAspect" class="com.itheima.service.aspect.LogAspect"/>
<!--2. 使用aop.config标签把目标对象与切面对象组合到一块形成一个切面。-->
<aop:config>
<!-- -->
<aop:aspect ref="自定义的切面类">
<!-- 2.1 切入点表达式 : 代表了我需要增强UserServiceImpl的所有方法-->
<aop:pointcut id="pt" expression="execution(* com.itheima.service.impl.UserServiceImpl.*(..))"/>
<!--2.2 切面 = 通知+切入点 -->
<aop:before method="切面类的方法名" pointcut-ref="pt"/>
<!--前置通知-->
<aop:before method="before" pointcut-ref="pt"/>
<!--后置通知-->
<aop:after-returning method="afterReturn" pointcut-ref="pt"/>
<!--异常通知-->
<aop:after-throwing method="agfterException" pointcut-ref="pt"/>
<!--最终的通知-->
<aop:after method="afterFinal" pointcut-ref="pt"/>
<!--配置环绕通知-->
<aop:around method="around" pointcut-ref="pt"/>
</aop:aspect>
</aop:config>
<!-- 02 注解方式 开启aop的注解扫描 -->
<!-- 切面类上添加注解 @Aspect 方法上 @PointCut( ) @Before @After @AfterReturning @AfterThrowing @Around-->
<aop:aspectj-autoproxy/>
<!-- 03 纯注解开发-->
<!--
创建一个配置类加上@Configuration注解,代替bean.xml配置文件。
@Configuration 该注解的作用代表了该类是一个配置类,用于取代bean.xml文件的。
@EnableAspectJAutoProxy 扫描aop相关的注解的。(@Aspect ,@PointCut(),@Before,@After,@AfterReturning,@AfterThrowing,@Around)
@ComponentScan("com.itheima") 扫描 ioc 相关的注解的 @Respository @Service @Controller @component这些注解的
@PropertySource("classpath:db2.propertes") 用于指定加载配置文件的。
@Bean("dataSource") 方法上一旦添加 @Bean("dataSource")注解,那么该方法会自动执行,
并且把该方法的返回值存储到容器中。
-->
( 三) Spring Aop声明式事务管理
<!-- 01 xml 配置-->
<!--由于dao维护了一个jdbctemplate成员变量,所以需要注入-->
<bean id="jdbctemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl">
<property name="jdbcTemplate" ref="jdbctemplate"/>
</bean>
<!-- 创建一个连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<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>
<!--1. 创建目标对象+切面对象-->
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
<property name="accountDao" ref="accountDao"/>
</bean>
<!--创建切面对象,spring已经为我们提供好了事务管理器,我们目标是要把事务管理器的代码添加到service方法上面-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--2. 事务管理器配置通知的规则:为哪些方法配置事务-->
<tx:advice id="adive" transaction-manager="transactionManager">
<tx:attributes>
<!-- <!–spring在匹配一个方法事务要事务的时候是从上往下匹配的,只有匹配到其中一个,那么就不会再往下去执行了。–>
<tx:method name="find*" propagation="SUPPORTS"/>
<tx:method name="get*" propagation="SUPPORTS"/>
<tx:method name="query*" propagation="SUPPORTS"/>
<tx:method name="select*" propagation="SUPPORTS"/>
<!–所有的方法必须要有事务–>
<tx:method name="*" propagation="REQUIRED"/>-->
<!--事务的规则:哪些方法是需要事务管理的。-->
<tx:method name="save" isolation="DEFAULT" propagation="REQUIRED"/>
<!-- propagation:事务传播行为,REQUIRED代表了一定要有事务, SUPPORTS代表事务可有可无-->
<tx:method name="findAll" isolation="DEFAULT" propagation="SUPPORTS"/>
</tx:attributes>
</tx:advice>
<!--3.切面-->
<aop:config>
<!--切入点表达式-->
<aop:pointcut id="pt" expression="execution(* com.itheima.service.impl.AccountServiceImpl.*(..))"/>
<aop:advisor advice-ref="adive" pointcut-ref="pt"/>
</aop:config>
<!-- 02 注解方式 开启事务管理器扫描 @transactional 等同于上面的2 和3 -->
<!--
在service层实现类 需要开启事务的类 方法 接口上使用 @Transactional注解
@Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED,noRollbackFor = NullPointerException.class ) // 事务注解
transactionManager: 引用的事务管理器的id
默认@Transactional根据类型进行注入
如果有多个类型才会按照名称进行注入
value: 和transactionManager的值一样的
isolation: 设置事务的隔离级别
propagation: 设置事务的传播行为
rollbackFor: (理论)针对某些异常进行事务回滚 (实际测试,所有异常都可以进行事务控制 )
noRollbackFor: 针对某些异常不进行事务回滚 (实际测试是OK的)
-->
<!--扫描事务管理器 专门用于扫描@transactional注解-->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 03 纯注解开发-->
<!--
创建一个配置类加上@Configuration注解,代替bean.xml配置文件。
@ComponentScan("com.itheima") 扫描 ioc 相关的注解的 @Respository @Service @Controller @component这些注解的
@Configuration 该注解的作用代表了该类是一个配置类,用于取代bean.xml文件的。
@EnableTransactionManagement //开启事务管理的扫描 扫描@Transactional注解
@Import(配置类名.class) // 导入其他的配置类的。
-->
(四) Spring整合MyBatis配置
<!-- Spring整合MyBatis配置(1)创建SqlSessionFactory对象,
因为每一个dao的代理对象都需要从SqlSession中获取,每一个SqlSession又必须从SqlSessionFactory中产生。
-->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--A.注入数据源-->
<property name="dataSource" ref="dataSource"/>
<!--
<property name="typeAliasesPackage" value="扫描包,配置别名"/>
<property name="configLocation" value="配置SqlMapConfig.xml"/>
<property name="mapperLocations" value="配置加载的映射文件"/>
-->
<!--别名扫描-->
<property name="typeAliasesPackage" value="com.itheima.entity"/>
<!-- 分页插件 PageHelper 配置-->
<!-- 注意其他配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的方式配置参数,一行配置一个 -->
<value>
params=value1
</value>
</property>
</bean>
</array>
</property>
</bean>
<!-- Spring整合MyBatis配置(2)创建映射扫描配置
创建一个Dao对象 进行包扫描, 扫描mybatis
不再使用 JdbcTemplate 创建Dao实现类,直接使用MyBatis MapperScannerConfigurer
Dao 使用注解 或者 Mapper映射文件 创建 Dao实现类
1.会自动加载映射文件; 2. 也会加载dao方法上注解; 3. 生成代理对象
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--A. 自动加载该路径下的映射文件-->
<!--B. 自动加载该路径下的dao接口文件(读取方法上的注解) dao同一个方法,要么通过注解映射要么通过配置Mapper映射-->
<!--C. 自动对包下的所有接口生成代理对象-->
<property name="basePackage" value="com.itheima.dao"/>
</bean>
(五) spring整合shiro配置
<!--1. 配置shiro的过滤器工厂, bean的id与web.xml中的配置的shiro过滤器名称一致.-->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!--A. 注入Shiro安全管理器-->
<property name="securityManager" ref="securityManager"/>
<!--B.注入其他配置-->
<!--B1.登陆地址. 认证失败后自动跳转到的页面.-->
<property name="loginUrl" value="/login.jsp"/>
<!--B2.认证成功后默认跳转的页面. 如果程序由指定会覆盖这里-->
<property name="successUrl" value="/home.jsp"/>
<!--B3.权限校验失败,跳转的页面-->
<property name="unauthorizedUrl" value="/unauthorized.jsp"/>
<!--C.过滤器链的配置-->
<!--anon 匿名访问过滤器,指定需要放行的资源-->
<!--authc 认证过滤器-->
<property name="filterChainDefinitions">
<value>
/css/** = anon
/img/** = anon
/make/** = anon
/plugins/** = anon
/login.jsp = anon
/login* = anon
/index.jsp = anon
<!-- shiro 授权 需要多个权限 perms=["权限1","权限2"] -->
<!--/system/user/list.do = perms["用户管理"] -->
/** = authc
</value>
</property>
</bean>
<!--2. 创建安全管理器-->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="myRealm"/>
</bean>
<!--3. 创建自定义的realm对象 自定义realm类:AuthRealm,继承AuthorizingRealm -->
<bean id="myRealm" class="cn.itcast.web.shiro.AuthRealm">
<!--注入凭证匹配器,自动对用户输入的密码按照指定的算法加密-->
<property name="credentialsMatcher" ref="credentialsMatcher"/>
</bean>
<!--4. 创建凭证匹配器,指定加密算法为md5
<bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
自动对用户输入的密码按照md5加密
<property name="hashAlgorithmName" value="md5"/>
</bean>
-->
<!--4. 自定义凭证匹配器 自定义类 继承 SimpleCredentialsMatcher类 指定加密算法 -->
<bean id="credentialsMatcher" class="cn.itcast.web.shiro.CustomCredentialsMatcher"/>
<!--5. 配置shiro注解支持
1. 在applicationContext-shiro.xml中开启shiro注解支持
2. 开启Aop自动代理(已经完成)
3. 在controller中对应的方法上或类上使用@RequiresPermissions({“权限1”,”权限2“})注解
depends-on 表示创建当前bean之前,先创建depends-on依赖的对象.控制对象创建顺序 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
(六) dubbodemo_provider
<!--指定服务提供者名称,通常为项目名称。可以随意定义,唯一即可。-->
<dubbo:application name="dubbodemo_provider"/>
<!--配置注册中心地址-->
<dubbo:registry address="zookeeper://192.168.217.128:2181"/>
<!--
配置请求协议
name 指定的是传输协议的名称,
值列表范围如:dubbo rmi hessian webservice http
port:服务提供者的真实请求端口
-->
<dubbo:protocol name="dubbo" port="20881"/>
<!--配置dubbo服务提供者的包扫描 @Service(timeout = 100000) 设置超时时间为100秒。默认1秒 import com.alibaba.dubbo.config.annotation.Service -->
<dubbo:annotation package="com.itheima.service"/>
<!-- 如果不使用包扫描,也可以通过如下配置的方式来发布服务-->
<!-- <bean id="helloService" class="com.itheima.service.impl.HelloServiceImpl" />-->
<!-- <dubbo:service interface="com.itheima.service.HelloService" ref="helloService" />-->
(七) dubbo_consumer
<!--开启SpringMVC注解扫描,扫描@Controller注解-->
<context:component-scan base-package="com.itheima.web"/>
<!--SpringMVC注解驱动-->
<mvc:annotation-driven/>
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="dubbodemo_consumer">
<dubbo:parameter key="qos.enable" value="false"/>
</dubbo:application>
<!--配置注册中心地址-->
<dubbo:registry address="zookeeper://192.168.217.128:2181"/>
<!-- 默认值为true,表示启动服务消费者时候会检查服务提供者是否有启动,如果服务提供者没有启动消费者启动不了。-->
<!-- <dubbo:consumer check="false"/>-->
<!--dubbo开启包扫描 注解扫描( @Reference(retries = 2)注解 retries = 2调用dubbo服务如果超时,自动重试2次 retries可选填 )-->
<dubbo:annotation package="com.itheima.web"/>
<!-- 如果不使用包扫描,通过如下配置来引用服务,生成远程服务代理,可以和本地bean一样使用helloService
此时 controller 中
@Autowired // 注意这里用@Autowired,因为是配置的方式创建的接口代理且加入了容器
private HelloService helloService;
-->
<dubbo:reference id="helloService" interface="com.itheima.api.HelloService"/>
<!-- -->
(八) Spring整合Quartz 定时任务调度 配置
<!--1. 将自定义的 定时任务类交给spring容器-->
<bean id="myTask" class="cn.itcast.web.task.MyTask"/>
<!--2. 创建任务工厂,配置定时执行的类和方法-->
<bean id="jobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myTask"/>
<property name="targetMethod" value="execute"/>
</bean>
<!--3. 创建任务调度触发器,注入任务执行表达式 -->
<bean id="trigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail"/>
<!--秒 分 小时 日 月 周 年-->
<property name="cronExpression" value="0/5 * * * * ?"/>
</bean>
<!--4. 配置定时任务管理器-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<array>
<!--注入任务调度触发器-->
<ref bean="trigger"/>
</array>
</property>
</bean>
(九) WebService JAX-RS 规范下 Spring整合CXF发布服务
<!-- <?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:cxf="http://cxf.apache.org/core"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/core
http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd
">
<jaxrs:server address="/userService" serviceClass="cn.itcast.service.UserServiceImpl"/>
</beans>
-->
(十) Spring整合 RabbitMQ topic通配符模式
<!-- 一 生产者配置 -->
<!--配置连接-->
<rabbit:connection-factory
id="connectionFactory"
host="192.168.23.1"
port="5672"
username="heima"
password="888"
virtual-host="/itcast"/>
<!--配置RabbitAdmin-->
<rabbit:admin connection-factory="connectionFactory" />
<!--配置队列名-->
<rabbit:queue name="myQueue"/>
<!--配置topic类型exchange;队列绑定到交换机-->
<rabbit:topic-exchange name="myExchange">
<rabbit:bindings>
<rabbit:binding queue="myQueue" pattern="msg.#" />
</rabbit:bindings>
</rabbit:topic-exchange>
<!--配置 RabbitTemplate对象加入容器
Map<String,String> map = new HashMap<>();
map.put("email","123456789@qq.com");
rabbitTemplate.convertAndSend("msg.email",map); // 发送消息 -->
<rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"
exchange="myExchange" message-converter="jsonMessageConverter"/>
<!-- 消息对象json转换类 -->
<bean id="jsonMessageConverter"
class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" />
<!-- 二 消费者配置 -->
<!--组件扫描, 扫描自定义的消息监听器 需要添加pom依赖 spring-context -->
<context:component-scan base-package="cn.itcast.listener"/>
<!--配置连接-->
<rabbit:connection-factory
id="connectionFactory"
host="192.168.23.1"
port="5672"
username="heima"
password="888"
virtual-host="/itcast"/>
<!--配置RabbitAdmin-->
<rabbit:admin connection-factory="connectionFactory" />
<!--配置队列名-->
<rabbit:queue name="myQueue"/>
<!--配置监听 emailMessageListener为自定义的消息监听器 实现 MessageListener接口 -->
<rabbit:listener-container connection-factory="connectionFactory">
<rabbit:listener ref="emailMessageListener" queue-names="myQueue" />
</rabbit:listener-container>
(十一) Spring整合 ActiveMQ
<!-- 一 生产者 -->
<!-- 1. 创建ActiveMQ连接工厂 -->
<amq:connectionFactory
id="amqConnectionFactory"
userName="admin" password="admin"
brokerURL="tcp://192.168.23.51:61616"/>
<!-- 2. 创建缓存工厂 -->
<bean id="cachingConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<!-- 注入 连接工厂-->
<property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
<!-- session缓存数目 -->
<property name="sessionCacheSize" value="5"></property>
</bean>
<!-- 3. 创建JmsTemplate(发送消息的模板工具类对象) -->
<!-- 3.1发送Queue队列消息 -->
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 注入缓存工厂 -->
<property name="connectionFactory" ref="cachingConnectionFactory"></property>
<!-- 默认值 -->
<property name="pubSubDomain" value="false"></property>
</bean>
<!-- 3.2发送Topic主题消息 -->
<bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 注入缓存工厂 -->
<property name="connectionFactory" ref="cachingConnectionFactory"></property>
<!-- 设置消息模型为主题消息 -->
<property name="pubSubDomain" value="true"></property>
</bean>
<!-- 二 消费者 -->
<!-- 1. 创建ActiveMQ连接工厂 -->
<amq:connectionFactory
id="amqConnectionFactory"
userName="admin" password="admin"
brokerURL="tcp://192.168.12.132:61616"/>
<!-- 2. 创建缓存工厂 -->
<bean id="cachingConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<!-- 注入 连接工厂-->
<property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
<!-- session缓存数目 -->
<property name="sessionCacheSize" value="5"></property>
</bean>
<!--开启注解扫描-->
<context:component-scan base-package="cn.itcast.spring_activemq_consumer"/>
<!--
配置消息监听器类,监听队列或主题消息模型中的消息。从而实现消费消息。
jms:listener-container
destination-type 监听的JMS消息类型(queue、topic)
connection-factory Spring的缓存连接工厂
jms:listener
destination 对应MQ中队列名称或主题名称
rel 自定义的消息监听器类(实现MessageListener接口)
-->
<!-- 3.1 监听指定名称(email)的队列中的消息-->
<jms:listener-container destination-type="queue" connection-factory="cachingConnectionFactory">
<jms:listener destination="email" ref="emailMessageListener"/>
</jms:listener-container>
<!-- 3.2 监听指定名称(email)的主题中的消息 -->
<jms:listener-container destination-type="topic" connection-factory="cachingConnectionFactory">
<jms:listener destination="sms" ref="smsMessageListener"/>
</jms:listener-container>
</beans>