首页 / 资讯中心 / 文章详情

Spring配置补充 (随笔详情扩展:)

Spring配置补充 (随笔详情扩展:) ★ FEATURED ARTICLE
Spring配置补充实现Spring 和 MyBatis 集成过程中学习了,Spring 的配置数据源的方法; 实际开发过程中还有很多灵活的配置文件;灵活配置DataSource:!-- 远古方法最初方法,数据库连接池,不过我最喜欢用的; --beaniddataSourceclassorg.apache.commons.dbcp.BasicDataSourcepropertynamedriverClassNamevaluecom.mysql.jdbc.Driver/propertynameurlvaluejdbc:mysql://localhost:3306/cart/propertypropertynameusernamevalueroot/propertypropertynamepasswordvalueok/property/bean方式一使用属性文件配置数据源;还记得MyBatis可以引用外部的 .properties文件来配置数据源吗Spring对于这些操作当然是小ks了;首先,引入外部的文件,你前提得有哦假设为datasource.propertiesdrivercom.mysql.jdbc.Driver passwordok #urljdbc:mysql://localhost/cart #userroot!-- 方式一使用属性文件配置数据源, --!-- 创建Bean classxx..PropertyPlaceholderConfigurer --beanclassorg.springframework.beans.factory.config.PropertyPlaceholderConfigurerpropertynamelocationvalueclasspath:datasource.properties/!-- 给属性赋值引用外部文件--/bean!-- 然后就是和之前的一样了,这样好处也就是可以把,数据源配置分开处理,便于维护,方便处理.. --beaniddataSourceclassorg.apache.commons.dbcp.BasicDataSourcepropertynamedriverClassNamevalue${driver}/!-- 通过${name} 来获取值;注意这里必须要完全和name一样,空格 啥的注意哦--propertynameurlvaluejdbc:mysql://localhost:3306/cart/propertypropertynameusernamevalueroot/propertypropertynamepasswordvalue${password}/property/bean方式二使用JNDI配置数据源; 了解JNDI 可以————— 点击.!-- 方式二JNDI配置数据源 配置JNDI的数据源(两种配置方式) 1.在tomcat安装目录下打开conf文件夹打开context.xml文件在context/context标签之内插入代码context.xml 好处好处就是运行在配置过JNDI数据源的web容器下的项目都可以使用该数据源也就是说在容器中配置好数据源之后数据源在该web容器中是共享的。(多个项目可以使用) 2.将数据源配置在项目中这样做的好处就是为每一个项目单独指定一个数据源也就是说数据源不会在服务器中共享。 配置方法在项目路径下新建一个文件夹/src/main/webapp/META-INF/context.xml如果没有可自行创建。 --!-- Spring的配置文件: JndiObjectFactoryBean--beaniddataSourceclassorg.springframework.jndi.JndiObjectFactoryBeanpropertynamejndiNamevaluejava:comp/env/jdbc/cart/value!-- java:comp/env是固定写法后面的jdbc/cart 是,配置文件中的 name;--/property/bean服务器context.xml / 项目context.xml 中配置 数据源;ContextResourcenamejdbc/cartauthContainertypejavax.sql.DataSourcedriverClassNamecom.mysql.jdbc.Driverurljdbc:mysql://localhost:3306/cartusernamerootpasswordokmaxActive50maxIdle30maxWait10000//Context!-- 注意: 访问数据库/root/密码...,根据需求来,服务器的 服务器context.xml 已有Context节点就可以省了 --方式三C3P0实现数据源配置!-- 方式三C3P0实现数据源配置,Spring对C3P0有封装实现 --beaniddataSourceclasscom.mchange.v2.c3p0.ComboPooledDataSourcepropertynamedriverClassvaluecom.mysql.jdbc.Driver/propertypropertynamejdbcUrlvaluejdbc:mysql://localhost:3306/cart/propertypropertynameuservalueroot/propertypropertynamepasswordvalueok/property!--依次为数据库连接池最小连接数、最大连接数、初始连接数--propertynameminPoolSizevalue3/propertypropertynamemaxPoolSizevalue15/propertypropertynameinitialPoolSizevalue3/property/beanSpring中Bean的作用域:Bean的作用域作用域说明singleton默认值。Spring以单例模式创建Bean的实例即容器中该Bean的实例只有一个prototype每次从容器中获取Bean时都会创建一个新的实例, Spring不能对一个property bean的整个生命周期负责 因此客户端要负责property实例的生命周期管理request用于Web应用环境针对每次HTTP请求都会创建一个实例session用于Web应用环境同一个会话共享同一个实例不同的会话使用不同的实例global session仅在Portlet的Web应用中使用同一个全局会话共享一个实例。对于非Portlet环境等同于session实例Spring配置文件applicationContext.xml!-- 默认, singleton--beanida类class类路径/bean!-- 指定作用域, prototype --beanidb类class类路径scopeprototype/bean!-- scope:设置作用域的值 --publicstaticvoidmain(String[]args){ApplicationContextcontextnewClassPathXmlApplicationContext(applicationContext.xml);Aa1(A)context.getBean(a类);//bean id;Aa2(A)context.getBean(a类);//bean id;System.out.println(a1a2);//结果为 true; 因为,Bean创建的默认级别以单例模式创建的,即该类对象在整个应用程序中,只有一个实例,多个对象指向是同一个空间地址;//单例模式的变量导致线程不安全;//一个程序只有一个 SqlSession 对象,当A线程执行新增 B修改,B完成了操作关闭了SqlSession 因为整个应用程序公用一个,导致A的也关闭了. A操作失败//解决://可以通过改变, Spring中Bean的作用域: bean id…… class…… scope作用域/bean//B 类,Spring管理时设置了 scope 作用域;Bb1(B)context.getBean(b类);//bean id;Bb2(B)context.getBean(b类);//bean id;System.out.println(b1b2);//结果为 false;}A B 类就随便创就好了☺使用注解指定Bean的作用域对于使用注解声明Bean 组件,如需修改其作用域可以使用Scope注解实现关键字:Scope(prototype)//指定作用域;Component//声明Bean;publicclassA{}Spring的自动装配之前章节介绍通过,Autowired或Resource注解实现依赖注解, 依靠着 Spring容器的自动装配功能;通过自动装配技术, 可以将与属性类型相符的 (对于Resource注解而言 还会尝试, ID 和属性名相符合) Bean自动注入给属性; 简化操作autowire属性值及说明值说明no默认值。Spring 默认不进行自动装配必须显式指定依赖对象byName根据属性名自动装配。Spring 自动查找与属性名相同的id如果找到则自动注入否则什么都不做byType根据属性的类型自动装配。Spring 自动查找与属性类型相同的Bean如果刚好找到唯一的那个则自动注入如果找到多个与属性类型相同的Bean则抛出异常如果没找到就什么也不做constructor和byType 类似不过它针对构造方法。如果 Spring 找到一个Bean和构造方法的参数类型相匹配则通过构造注入该依赖对象如果找不到将抛出异常实例Spring配置文件applicationContext.xml!-- 默认, singleton--beanida类class类路径autowirebyName!--根据属性名自动装配,查找 属性名与Bean id 匹配的自动装配 --propertyname属性名: BrefB/property!--向这种属性名 B 和要指定的Bean id一样的就可以省略不写了--..../bean!-- autowire:指定匹配方式 --在Spring 配置文件中, 通过 bean 元素, autowire 属性实现自动装配 beans 根目录还提供了 default-autowire 属性, 设置该属性 影响全局, 减少单个 Bean的注入方式;?xml version1.0 encodingUTF-8?beansxmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:phttp://www.springframework.org/schema/pxmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxmlns:txhttp://www.springframework.org/schema/txxsi:schemaLocationhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsddefault-autowiredefault!-- default-autowire设置全局操作;自动装配方式 --!-- 不过这种方式,对于大型应用,不鼓励使用自动装配,虽然可以减少工作量,但大大的降低了依赖关系,清晰性 透明性; 不能显而易见属性..类型.. 不利于高层次解耦合; --/beans拆分Spring配置文件项目规模变大配置文件可读性、可维护性差团队开发时多人修改同一配置文件易发生冲突更符合 “分而治之“ 的软件工程原理~两种方式方式一当一个项目中有多个 Spring 配置文件applicationContext1.xml applicationContext2.xml …读取时通过:ApplicationContext context new ClassPathXmlApplicationContext(“applicationContext1.xml”,“applicationContext2.xml”);方法的 重载来实现一次读取多个 配置文件;或通过 * 通配符来指定多个;ApplicationContext context new ClassPathXmlApplicationContext(“applicationContext *.xml”); // 文件的前缀. *来指定一定规范的命名文件除此之外还支持, String[] 形式传参数...方式二设置一个配置文件为 配置文件的集成文件;假设存在 A B 两个Spring 配置文件, 可以在 A 在引入B 文件/或更多…;读取时候读取 A 就同时读取了 B …文件;A文件使用来引入其它文件; import resource“B文件引用” /配置web.xmlweb.xml 都知道吧, 每一个 web项目都有一个 web.xml文件;启动一个WEB项目的时候WEB容器会去读取它的配置文件web.xml 进行配置…Spring配置文件:对于web项目:Spring配置文件需要在 web.xml 中进行配置, 以达到程序加载初始化读取Spring:对Spring配置文件进行初始化...不在像以前控制台操作时通过:ApplicationContext context new ClassPathXmlApplicationContext(Spring配置文件);加载Spring容器;1.web.xml 中通过contextConfigLocation参数指定,Spring配置文件的路径;2.web 项目使用前: 启动对Spring容器加载; Spring提供一个监听器org.springframework.web.context.ContextLoaderListener该监听器实现了 : ServletContextListenter 接口, 可以在web 容器启动时候初始化 Spring容器;web.xml?xml version1.0 encodingUTF-8?web-appxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlnshttp://java.sun.com/xml/ns/javaeexsi:schemaLocationhttp://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsdversion3.0display-namexxxxxx/display-name!-- 描述的项目名 title --!-- 监听器: web项目使用前: 启动对Spring容器加载; --listenerlistener-classorg.springframework.web.context.ContextLoaderListener/listener-class/listenercontext-paramparam-namecontextConfigLocation/param-name!-- 指定Spring配置文件的位置路径 --param-valueclasspath:applicationContext-mybatis.xml/param-value!-- 指定Spring配置文件的位置路径 --/context-param/web-app通过以上web.xml 配置, 就可以在启动同时初始化 Spring 容器了:注意:如果没有指定 contextConfigLocation 的参数, contextConfigLocation 会默认去查找: /WEB-INF/applicationContext.xml换句话说就是: 如果我们将 SpringMVC的名字默认为:applicationContext.xml并存储在 WEB-INF 路径下;即使不指定 contextConfigLocationweb.xml也会默认, 实现配置文件的加载~此外我们对于一些文件名较长的复杂的也可以同过 : applicationContetx-*.xml 通配符形式来实现装载文件;小扩展classpath:上述Demo及日常也经常看到 classpath 来配置文件路径…classpath 到底是啥呢? :classpath 表示是不是src 而是 WEB-INF/classes lib ( WEB-INF/ 是资源目录客户端不可以直接访问. )我们都知道一个传统的web项目结构: 如下↓↓↓即使在src 中存储的 配置文件, 最后部署也会加载至项目 WEB-INF/calsses 文件中;所以 classpath 表示的是 WEB-INF/calsses 目录;lib 和 classes 文件同属于 classpath , 两者的访问优先级为: libclasses 即: 两个文件下存在相同文件名, classpath: 文件名.指定的是lib 下的;ok。 又搞完一章, 智勇你看完了吗
阅读完成 · 觉得有帮助?
咨询建站