Spring应用扩展
Posted pere
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring应用扩展相关的知识,希望对你有一定的参考价值。
L120401X1将某些配置写在property文件中
1、在resource目录下新建database.properties,里面输入以下键值对
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&characterEncoding=utf-8
jdbc.user=root
jdbc.password=112
2、在applicationContext.xml进行以下配置
(1)注释掉原来的数据源配置
<!-- 配置数据源 -->
<!-- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms? useUnicode=true&characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="112" />
</bean> -->
(2)配置以下新的代码
<!-- 使用property文件配置数据源 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:database.properties</value>
</property>
</bean>
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
3、运行结果
cn.smbms.dao.user.UserMapperTest - UserMapperTest userCode---> zhaoyanand userName:赵燕
L120401X2
1、在D:javastudywebapache-tomcat-7.0.41conf这个目录下的context.xml文件<Context>里配置以下内容JNDI数据源的配置
<Resource name="jndi/smbms"
auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" driverClassName="com.mysql.jdbc.Driver" username="root" password="112"
url="jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&characterEncoding=utf-8"/>
前面contex文件中已有的代码备份
<Resource name="jdbc/news"<!-- 后面通过这个逻辑名拿到数据源 -->
auth="Container" type="javax.sql.DataSource" <!-- 数据源类型 --> maxActive="100" <!-- 连接池里面最大的连接 -->
maxIdle="30"<!-- 最大的等待连接数--> maxWait="10000" <!-- 最大的等待时间 --> username="root" password="112" driverClassName="com.mysql.jdbc.Driver"<!-- 数据库驱动-->
url="jdbc:mysql://127.0.0.1:3306/kgcnews"/><!-- 数据库路径-->
2、在项目中的test下cn.smbms.dao.user目录中新建servlet名字为UserTestServlet,将UserMapperTest.java的以下代码复制进去
private Logger logger= Logger.getLogger(UserTestServlet.class);
放在最前面
User user=new User();
user.setUserName("赵");
user.setUserRole(3);
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapper=(UserMapper)ctx.getBean("userMapper");
List<User> userList=userMapper.getUserList1(user);
for(User user1:userList){
logger.debug("UserMapperTest userCode---> " + user1.getUserCode()
+"and userName:"+user1.getUserName());}
放在get方法里面
3、启动tomcat,在浏览器中输入
http://localhost:8080/L120301X1SpringAndMybatis/servlet/UserTestServlet进行访问
L120402X1
测试bean的作用域
1、将最近的UserMapperTest.java复制到test下面的cn.smbms.dao.user目录下,然后将applicationContext.xml中的将数据源配置在tomcat的配置代码注释,将之前的配置数据源的代码恢复
(1)注释以下代码
<!-- 将数据源配置在tomcat中 -->
<!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jndi/smbms</value>
</property>
</bean> -->
(2)恢复以下代码
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms?
useUnicode=true&characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="112" />
</bean>
(3)另外配置以下代码
<!-- pojo -->
<bean id="user" class="cn.smbms.pojo.user" scope="singleton">
<property name="userName" value="jason"></property>
</bean>
(4) 在UserMapperTest.java中配置以下代码测试
@Test
public void testSingleton(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
User user1=(User)ctx.getBean("user");
logger.info("user1:"+user1.getUserName());
User user2=(User)ctx.getBean("user");
logger.info("user2:"+user2.getUserName());
}
(5)测试结果为
[INFO] 2019-11-03 09:08:14,332 cn.smbms.dao.user.UserMapperTest - user1:jason
[INFO] 2019-11-03 09:08:14,332 cn.smbms.dao.user.UserMapperTest - user2:jason
(6)不能看出单例模式scope="singleton"的作用,在UserMapperTest.java中重新赋值后观测其效果
@Test
public void testSingleton(){
ApplicationContext ctx=new
ClassPathXmlApplicationContext("applicationContext.xml");
User user1=(User)ctx.getBean("user");
logger.info("user1:"+user1.getUserName());
user1.setUserName("new jason");
logger.info("user1:"+user1.getUserName());
User user2=(User)ctx.getBean("user");
logger.info("user2:"+user2.getUserName());
}
(7)运行结果:
[INFO] 2019-11-03 10:00:31,989 cn.smbms.dao.user.UserMapperTest - user1:jason
[INFO] 2019-11-03 10:00:31,989 cn.smbms.dao.user.UserMapperTest - user1:new jason
[INFO] 2019-11-03 10:00:31,989 cn.smbms.dao.user.UserMapperTest - user2:new jason
从结果可以看出修改之后两次输出都是一样的,说明容器bean中的属性userName只有一个值
L120402X2
测试scope="prototype"的结果,对比与scope="singleton"的结果差异
(1)将applicationContext.xml中user的bean配置修改如下
<!-- pojo -->
<bean id="user" class="cn.smbms.pojo.User" scope="prototype">
<property name="userName" value="jason"></property>
</bean>
(2)UserMapperTest.java中的代码
@Test
public void testSingleton(){
ApplicationContext ctx=new
ClassPathXmlApplicationContext("applicationContext.xml");
User user1=(User)ctx.getBean("user");
logger.info("user1:"+user1.getUserName());
user1.setUserName("new jason");
logger.info("user1:"+user1.getUserName());
User user2=(User)ctx.getBean("user");
logger.info("user2:"+user2.getUserName());
}
(3)运行结果
[INFO] 2019-11-03 10:13:18,430 cn.smbms.dao.user.UserMapperTest - user1:jason
[INFO] 2019-11-03 10:13:18,430 cn.smbms.dao.user.UserMapperTest - user1:new jason
[INFO] 2019-11-03 10:13:18,430 cn.smbms.dao.user.UserMapperTest - user2:jason
从结果可以看出测试scope="prototype"与scope="singleton"的区别
L120402X3
测试@Scope的作用
1、在UserServiceImpl.java类的
public class UserServiceImpl implements UserService {代码前面加上@Scope("prototype")
2、在UserMapperTest.java中编写以下测试代码
@Test
public void testService(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService1=(UserService)ctx.getBean("userService");
UserService userService2=(UserService)ctx.getBean("userService");
logger.debug(userService1==userService2);
}
(3)运行结果为
2019-11-03 10:53:43,247 cn.smbms.dao.user.UserMapperTest - false
(4)如果将@Scope("prototype")改成@Scope("singleton")测试结果为2019-11-03 10:58:57,642 cn.smbms.dao.user.UserMapperTest - true
这里是在在userService的bean前面@Service("userService")前加上@Scope("prototype")的,在配置文件applicationContext.xml里面没有userService的bean
L120403X1
测试autowire的作用
1、注释applicationContext.xml中的service的bean的属性userMapper的值的配置同时在service的bean中加入autowire="byName"
<!-- 配置业务service的bean -->
<bean id="userService" class="cn.smbms.service.UserServiceImpl" autowire="byName">
<!-- <property name="userMapper" ref="userMapper"></property>-->
</bean>
2、测试public void testUserService() 测试代码结果2019-11-03 11:24:55,502 cn.smbms.dao.user.UserMapperTest - UserMapperTest userCode---> zhaoyanand userName:赵燕
这里只有1个property不能显示出其好处,如果property多了就显示出来了
3、将autowire="byName"改成autowire="byType"测试结果一样
4、byName不存在找到多个,但是byType可能会找到多个,现在测试找到多个会怎么样
(1)现增加一个userMapper1的bean,配置代码
<bean id="userMapper1" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="cn.smbms.dao.user.UserMapper"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
(2)在UserMapperTest.java中在public void testUserService()方法里面加上输出容器中userMapper的bean明细的代码,同时将autowire的值设置成为autowire="byName"
for(String s:ctx.getBeanNamesForType(UserMapper.class)){
logger.info(s);}
可以从结果中看到
[INFO] 2019-11-03 14:37:51,260 cn.smbms.dao.user.UserMapperTest - userMapper1
[INFO] 2019-11-03 14:37:51,260 cn.smbms.dao.user.UserMapperTest - userMapper
(3)修改成autowire="byType"后,由于有多个userMapper所以测试出错,这是改回autowire="byName"便不报错了
5、使用default-autowire="byName"实现全局自动装配
在<beans>的后面加上default-autowire="byName"便可实现全局装配,但是直接加上去会运行错误,因为有些bean不需要加default-autowire="byName",因此需要对这些bean单独进行autowire="no"的配置,配置后运行成功
L120404X1
拆分applicationContext.xml配置文件
applicationContext.xml保留公共的代码
applicationContext-dao.xml保留dao的代码
applicationContext-service.xml保留service的代码
1、利用ClassPathXmlApplicationContext的重载方法将各文件链接起来
ApplicationContext ctx=new ClassPathXmlApplicationContext( "applicationContext.xml","applicationContext-dao.xml","applicationContext-service.xml");
2、使用<import resource="applicationContext-dao.xml"/>方式了解拆分后的配置文件,在测试类中仍然是
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
在applicationContext.xml中配置代码
<import resource="applicationContext-dao.xml"/>
<import resource="applicationContext-service.xml"/>
以上是关于Spring应用扩展的主要内容,如果未能解决你的问题,请参考以下文章
扩展 Jhipster JWT (Spring) 单体应用程序以支持模拟
Spring 框架 4.0 和 Spring security 3.2.4 上的 Spring Security SAML 扩展