Spring4 javaConfig配置方式并集成JUnit

来源:互联网 发布:go java 对比 编辑:程序博客网 时间:2024/06/05 20:54

Spring是相当吊的项目,多数场景下均是通过XML配置的方式使用它,下面简单介绍如何通过JavaConfig方式进行配置。说个题外话,之所以研究JavaConfig是我在研究spring security的时候,中文材料少的可怜,找到了一篇外文博客,写的还是很赞的,Spring Security 4 Hibernate Integration Annotation+XML Example,博文下面有项目下载地址,该项目零XML配置,下面就通过该项目介绍。

HibernateConfiguration.java类:该类的作用可等同applicationContext.xml,个人觉得类名取得不直观,但是要影响关键是说下类上面的注解的作用。

package com.websystique.springsecurity.configuration;import java.util.Properties;import javax.annotation.Resource;import javax.sql.DataSource;import com.websystique.springsecurity.dao.UserDao;import org.hibernate.SessionFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.*;import org.springframework.core.env.Environment;import org.springframework.jdbc.datasource.DriverManagerDataSource;import org.springframework.orm.hibernate4.HibernateTransactionManager;import org.springframework.orm.hibernate4.LocalSessionFactoryBean;import org.springframework.security.core.userdetails.UserDetailsService;import org.springframework.transaction.annotation.EnableTransactionManagement;//说明类为IoC容器@Configuration//事务@EnableTransactionManagement//指定自动扫描包@ComponentScan(basePackages = { "com.websystique.springsecurity" })//配置文件@PropertySource(value = { "classpath:application.properties" })//指定使用CGLIB代理,并开启@EnableAspectJAutoProxy(proxyTargetClass = true)public class HibernateConfiguration {    @Autowired    private Environment environment;    @Bean    public LocalSessionFactoryBean sessionFactory() {        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();        sessionFactory.setDataSource(dataSource());        sessionFactory.setPackagesToScan(new String[] { "com.websystique.springsecurity.model" });        sessionFactory.setHibernateProperties(hibernateProperties());        return sessionFactory;     }    @Bean    public DataSource dataSource() {        DriverManagerDataSource dataSource = new DriverManagerDataSource();        dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));        dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));        dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));        dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));        return dataSource;    }        private Properties hibernateProperties() {        Properties properties = new Properties();        properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));        properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));        properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));        return properties;            }        @Bean    @Autowired    public HibernateTransactionManager transactionManager(SessionFactory s) {       HibernateTransactionManager txManager = new HibernateTransactionManager();       txManager.setSessionFactory(s);       return txManager;    }}


HibernateConfiguration类中数据库源,事务,session工厂均有代码,很直观。

下面介绍如何集成Junit4,

很多资源spring-test与Junit4集成均是基于applicationContext.xml的,但是我们这里没有配置文件,所以需要做些改变:

新建一个基本的测试配置类:

package config;import com.websystique.springsecurity.configuration.HibernateConfiguration;import org.junit.runner.RunWith;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.context.web.WebAppConfiguration;import org.springframework.transaction.annotation.Transactional;/** * Created by li on 2016/1/14. *///指定测试类的运行者@RunWith(SpringJUnit4ClassRunner.class)//指定spring配置类@ContextConfiguration(classes = {HibernateConfiguration.class})//@WebAppConfiguration is a class-level annotation that is used to declare//that the ApplicationContext loaded for an integration test should be a WebApplicationContext.@WebAppConfiguration@Transactionalpublic class TestConfig {}
这里主要是ContextConfiguration的类要和上面的配置类对应好,下面集成Junit进行单元测试只要集成该基本类就可以了。下面进行单元测试:

package com.websystique.springsecurity.service;import config.TestConfig;import org.junit.Test;import javax.annotation.Resource;import static org.junit.Assert.assertNotNull;/** * Created by li on 2016/1/14. */public class UserServiceImplTest extends TestConfig{    @Resource(name = "userServiceImpl")    UserServiceImpl userServiceImpl;    @Test    public void testUserServiceClass() throws Exception {        assertNotNull(userServiceImpl);         System.out.println(userServiceImpl.getClass());    }}

注意:UserServiceImpl 集成了接口,正是使用的CGLIB做代理,所以才没有报错。

PS:

其中@EnableAspectJAutoProxy(proxyTargetClass = true)是我加入的,目的指定CLGLIB作为代理,是防止在Bean继承接口的,抛出nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'userServiceImpl' must be of type [com.websystique.springsecurity.service.UserServiceImpl], but was actually of type [com.sun.proxy.$Proxy43]异常。当然需要添加Maven依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${springframework.version}</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>${aspectj.version}</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectj.version}</version></dependency>





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手机装了sim卡没反应怎么办 小米手机打电话的图标没了怎么办 租房时和房东没签协议装修怎么办 三星安卓手机忘记锁屏密码怎么办 刷机了支付宝的余额宝钱没了怎么办 手机刷机支付宝里面的钱怎么办 支付宝宽带缴费交错账号了怎么办 电信宽带反回到翼支付里的钱怎么办 天猫盒子连接电视没反应怎么办 淘宝定制单发货之后是空物流怎么办 微信购买虚拟物品卖家不发货怎么办 虚拟商品确认收货后申请退款怎么办 手机换号码了淘宝怎么办又不能上网 美团酒店订单取消超时了怎么办 订单中快递单号填错了怎么办 高考动态口令卡页面找不到了怎么办 支付宝收钱码被别人扫了怎么办 上高速收费下高速免费卡怎么办 微信聊天记录导出来了是乱码怎么办 电脑用优盘打开文件夹是空的怎么办 快压解压文件在电脑上打不开怎么办 虎牙直播刺激战场观看有延迟怎么办 登录页面点击登录窗口关不了怎么办 h5中的摇晃手机在电脑端怎么办 忘记手机锁屏密码怎么办4g qq最早绑定的号码忘记了怎么办 重启路由器之后宽带连接不上怎么办 微信授权小程序总是不行怎么办 微信把钱转到别人账户里了怎么办 微信转到对方账户停用了怎么办 微信号被认为是投票水军怎么办 微信投票时显示账号异常怎么办 京东商城买东西老不到货怎么办 优酷投屏一会就会出现花报怎么办 苹果手机的app安卓找不到怎么办 微信网页获取用户信息点了否怎么办 淘宝卖家退发货信息选择错了怎么办 法宣在线出现在其他地方登陆怎么办 QQ被冻结又不知道申诉资料怎么办 开通优酷会员了再开酷喵会员怎么办 考的不好时别人问你多少分时怎么办