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应用扩展

如何扩展 Spring Boot 应用程序?

带有 ADFS 的 Spring saml 扩展

Dubbo中对Spring配置标签扩展

Spring 框架 4.0 和 Spring security 3.2.4 上的 Spring Security SAML 扩展