当前位置: 首页 > news >正文

中国制造网内贸站网站建设如何存数据

中国制造网内贸站,网站建设如何存数据,网站制作行业,如何建立一个网站并运行类似于小红书的目录 一#xff1a;Spring对IoC的实现 1. IoC 控制反转 2. 依赖注入 2.1 set注入 2.2 构造注入 3. set注入专题 3.1 注入外部Bean 3.2 注入内部Bean 3.3 注入简单类型 3.4 级联属性赋值#xff08;了解#xff09; 3.5 注入数组 3.6 注入List集合和Set集合 3.7…目录 一Spring对IoC的实现 1. IoC 控制反转 2. 依赖注入 2.1 set注入 2.2 构造注入 3. set注入专题 3.1 注入外部Bean 3.2 注入内部Bean 3.3 注入简单类型 3.4 级联属性赋值了解 3.5 注入数组 3.6 注入List集合和Set集合 3.7 注入Map和Properties集合 3.8 注入null和空字符串 3.9 注入的值中含有特殊符号 4. p命名空间注入 5.  c命名空间注入 6. util命名空间 7. 基于XML的自动装配byName byType 7.1 根据名称byName自动装配 7.2 根据类型byType自动装配 8. Spring引入外部属性配置文件使用context命名空间 一Spring对IoC的实现 前面我们已经学会了如何用spring创建管理对象接下来就要学习如何让对象和对象产生关系使用依赖注入 1. IoC 控制反转 1控制反转是一种思想一种新型的设计模式 2控制反转是为了降低程序耦合度提高程序扩展力达到OCP原则达到DIP原则。 3控制反转反转的是什么 ①将对象的创建权利交出去交给第三方容器负责。 ②将对象和对象之间关系的维护权交出去交给第三方容器负责。 4控制反转这种思想如何实现呢 DIDependency Injection依赖注入 2. 依赖注入 依赖注入实现了控制反转的思想 Spring通过依赖注入的方式来完成Bean管理的。Bean管理说的是Bean对象的创建以及Bean对象中属性的赋值或者叫做Bean对象之间关系的维护。 依赖注入 依赖指的是对象和对象之间的关联关系。注入指的是一种数据传递行为通过注入行为来让对象和对象产生关系。依赖注入常见的实现方式包括两种 第一种set注入第二种构造注入2.1 set注入 set注入基于set方法实现的底层会通过反射机制调用属性对应的set方法然后给属性赋值这种方式要求属性必须对外提供set方法 pom.xml配置 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.bjpowernode/groupIdartifactIdspring6-002-dependency-injection/artifactIdversion1.0-SNAPSHOT/versionpackagingjar/packaging!--配置多个仓库--repositories!--spring6里程碑的仓库--repositoryidrepository.spring.milestone/idnameSpring Milestone Repository/nameurlhttps://repo.spring.io/milestone/url/repository/repositoriesdependencies!--spring context依赖--dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion6.0.0-M2/version/dependency!--单元测试依赖--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version/dependency!--log4j2的依赖--dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion2.19.0/version/dependencydependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-slf4j2-impl/artifactIdversion2.19.0/version/dependency/dependenciespropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.target/properties/project log4j2.xml日志配置 ?xml version1.0 encodingUTF-8?configurationloggersroot levelDEBUGappender-ref refspring6log//root/loggersappendersconsole namespring6log targetSYSTEM_OUTPatternLayout pattern%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n//console/appenders/configuration UserDao类连接数据库的操作 package com.bjpowernode.spring6.dao;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class UserDao {// 一般声明为常量private static final Logger logger LoggerFactory.getLogger(UserDao.class);// 使用日志进行打印用System.out.println也可以public void insert(){logger.info(数据库正在保存用户信息);} }UserService类调用UserDao中的方法 ①set注入的话必须提供一个set方法Spring容器会调用这个set方法来给userDao属性赋值。 ②这个set方法不符合javabean规范也可以但是必须以set开头例如setUD也是可以的这里我使用的是IDEA自动生成的符合javabean规范的。 package com.bjpowernode.spring6.service;import com.bjpowernode.spring6.dao.UserDao;public class UserService {private UserDao userDao;// set注入必须提供一个set方法public void setUserDao(UserDao userDao) {this.userDao userDao;}public void saveUser(){// 调用UserDao保存用户信息userDao.insert();} }spring.xml配置 ①配置userDaoBean和UserService让spring管理这两个类。 ②对于UserService想让Spring调用对应的set方法需要配置property标签 name属性值set方法的方法名去掉set然后把剩下的单词首字母变小写ref属性值翻译为引用英语单词references后面指定的是要注入的bean的id ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:utilhttp://www.springframework.org/schema/utilxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd!--配置dao--bean iduserDaoBean classcom.bjpowernode.spring6.dao.UserDao/!--配置service--bean iduserServiceBean classcom.bjpowernode.spring6.service.UserServiceproperty nameuserDao refuserDaoBean //bean /beans ③另外对于property标签来说ref属性也可以采用标签的方式但使用ref属性是多数的 bean iduserServiceBean classcom.powernode.spring6.service.UserServiceproperty nameuserDaoref beanuserDaoBean//property /bean 编写测试类 package com.bjpowernode.spring6.test;import com.bjpowernode.spring6.service.UserService; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext;public class DITest {Testpublic void testSetDI(){ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(spring.xml);UserService userServiceBean applicationContext.getBean(userServiceBean, UserService.class);userServiceBean.saveUser();} }执行结果 正常输出日志信息了说明两个问题 ①spring正常创建UserDao和UserService对象了 ②spring关联了对象与对象之间的关系了 总结set注入的核心实现原理是通过反射机制调用set方法来给属性赋值让两个对象之间产生关系。 2.2 构造注入 核心原理通过调用构造方法来给属性赋值。 ①set注入是先创建对象才能执行set方法给属性赋值。 ②构造注入是在创建对象的同时给属性赋值时机是不同的。 在定义一个VipDao类 package com.bjpowernode.spring6.dao;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class VipDao {private static final Logger logger LoggerFactory.getLogger(VipDao.class);public void delete(){logger.info(正在删除信息);} }ConstructService类 构造方法注入必须要提供一个构造方法 package com.bjpowernode.spring6.service;import com.bjpowernode.spring6.dao.UserDao; import com.bjpowernode.spring6.dao.VipDao;public class ConstructService {private UserDao userDao;private VipDao vipDao;// 构造注入必须有构造方法public ConstructService(UserDao userDao, VipDao vipDao) {this.userDao userDao;this.vipDao vipDao;}public void save(){userDao.insert();vipDao.delete();} }bean.xml配置 访问的方式有三种使用的是constructor-arg标签 ①第一种方式是根据下标index的方式下标的顺序是构造方法参数的顺序。 ②第二种方式是根据构造方法参数的名字name的方式。 ③第三种方式是根据类型进行注入不指定spring会自己推断做类型匹配。 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean iduserDaoBean classcom.bjpowernode.spring6.dao.UserDao/bean idvipDaoBean classcom.bjpowernode.spring6.dao.VipDao/bean idconstructServiceBean classcom.bjpowernode.spring6.service.ConstructService!--第一种方式--constructor-arg index0 refuserDaoBean/constructor-arg index1 refvipDaoBean /!--第二种方式--constructor-arg nameuserDao refuserDaoBean/constructor-arg namevipDao refvipDaoBean/!--第三种方式--constructor-arg refuserDaoBean/constructor-arg refvipDaoBean //bean/beans 编写测试 package com.bjpowernode.spring6.test;import com.bjpowernode.spring6.service.ConstructService; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext;public class ConstructTest {Testpublic void testConstructDI(){ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(bean.xml);ConstructService constructServiceBean applicationContext.getBean(constructServiceBean, ConstructService.class);constructServiceBean.save();} }执行结果 3. set注入专题 set注入和构造注入中set注入用的比较多所以下面就学习一下set注入的专题 3.1 注入外部Bean 1在之前我们使用的案例一直就是注入外部Bean的方式 2外部Bean的特点bean定义到外面在property标签中使用ref属性进行注入通常这种方式是常用 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:utilhttp://www.springframework.org/schema/utilxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsdbean iduserDaoBean classcom.bjpowernode.spring6.dao.UserDao/bean iduserServiceBean classcom.bjpowernode.spring6.service.UserServiceproperty nameuserDao refuserDaoBean //bean /beans 3.2 注入内部Bean 内部Bean的方式在bean标签中直接嵌套bean标签不需要ref属性引入。 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:utilhttp://www.springframework.org/schema/utilxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsdbean iduserServiceBean classcom.bjpowernode.spring6.service.UserServiceproperty nameuserDaobean classcom.bjpowernode.spring6.dao.UserDao//property/bean /beans 3.3 注入简单类型 1之前在进行注入的时候对象的属性都是另一个对象那如果对象的属性是int类型呢也可以通过set注入的方式给该属性赋值实际上只要能够调用set方法就可以给属性赋值。 2重点如果给简单类型赋值就不能使用ref属性需要使用value属性 User类定义了两个简单类型写上set方法 package com.bjpowernode.spring6.bean;public class User {private String name;private int age;public void setName(String name) {this.name name;}public void setAge(int age) {this.age age;}Overridepublic String toString() {return User{ name name \ , age age };} }set-di.xm配置 注既可以使用value标签的方式也可以使用value属性的方式常用 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean iduserBean classcom.bjpowernode.spring6.bean.Userproperty nameage value18/property namename value张三//bean /beans 编写测试 package com.bjpowernode.spring6.test;import com.bjpowernode.spring6.bean.User; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext;public class SetDITest {Testpublic void testSimpleTypeSet(){ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(set-di.xml);User user applicationContext.getBean(userBean, User.class);System.out.println(user);} }执行结果默认会调用toString方法 需要特别注意如果给简单类型赋值使用value属性或value标签而不是ref 3那么简单类型包括哪些呢可以通过Spring的源码来分析一下 双击shift搜索BeanUtils类ctrlF12搜索isSimpleValueType方法里面都是简单类型 4这里重点说一下Date类型如果硬要把Date类型当做简单类型使用value赋值的话这个日期的格式有要求Thu Jan 12 21:05:49 CST 2023 所以在实际的开发中我们一般采用ref属性的方式给Date类型的属性赋值 5简单类型注入的经典案例给数据源的属性注入值 假设我们现在要自己手写一个数据源能够提供Connection对象的我们都知道所有的数据源都要实现javax.sql.DataSource接口并且数据源中应该有连接数据库的信息例如driver、url、username、password等。 数据源MyDataSource package com.bjpowernode.spring6.jdbc;import javax.sql.DataSource; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.logging.Logger;public class MyDateSource implements DataSource {private String driver;private String url;private String username;private String password;public void setDriver(String driver) {this.driver driver;}public void setUrl(String url) {this.url url;}public void setUsername(String username) {this.username username;}public void setPassword(String password) {this.password password;}Overridepublic String toString() {return MyDateSource{ driver driver \ , url url \ , username username \ , password password \ };}Overridepublic Connection getConnection() throws SQLException {return null;}Overridepublic Connection getConnection(String username, String password) throws SQLException {return null;}Overridepublic PrintWriter getLogWriter() throws SQLException {return null;}Overridepublic void setLogWriter(PrintWriter out) throws SQLException {}Overridepublic void setLoginTimeout(int seconds) throws SQLException {}Overridepublic int getLoginTimeout() throws SQLException {return 0;}Overridepublic Logger getParentLogger() throws SQLFeatureNotSupportedException {return null;}Overridepublic T T unwrap(ClassT iface) throws SQLException {return null;}Overridepublic boolean isWrapperFor(Class? iface) throws SQLException {return false;} }spring-datasource.xml使用spring的依赖注入完成数据源对象的创建和属性的赋值 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean namemyDataSource classcom.bjpowernode.spring6.jdbc.MyDateSourceproperty namedriver valuecom.mysql.jdbc.driver/property nameurl valuejdbc:mysql://localhost:3306/spring6/property nameusername valueroot/property namepassword value123//bean /beans 编写测试 package com.bjpowernode.spring6.test;import com.bjpowernode.spring6.bean.User; import com.bjpowernode.spring6.jdbc.MyDateSource; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext;public class SetDITest {Testpublic void testMyDataSource(){ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-datasource.xml);MyDateSource myDataSource applicationContext.getBean(myDataSource, MyDateSource.class);System.out.println(myDataSource);}}测试结果成功注入连接数据库的信息 3.4 级联属性赋值了解 我们先回顾一下原来使用的注入方式然后在使用级联属性赋值进行对比 clazz班级类 package com.bjpowernode.spring6.bean;public class Clazz {// 班级名称private String name;public void setName(String name) {this.name name;}Overridepublic String toString() {return Clazz{ name name \ };} }Student学生类 package com.bjpowernode.spring6.bean;public class Student {// 学生姓名private String name;// 班级private Clazz clazz;public void setName(String name) {this.name name;}public void setClazz(Clazz clazz) {this.clazz clazz;}Overridepublic String toString() {return Student{ name name \ , clazz clazz };} }第一种原来的注入方式 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean nameclazzBean classcom.bjpowernode.spring6.bean.Clazzproperty namename value高三一班//beanbean namestudentBean classcom.bjpowernode.spring6.bean.Studentproperty namename value张三/property nameclazz refclazzBean//bean /beans 第二种方式级联注入方式 使用级联属性赋值需要注意两点 ①配置的顺序不能颠倒先配置student在配置clazz ②clazz属性必须提供getClazz()方法所以要在Student类当中要增加getter方法 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean namestudentBean classcom.bjpowernode.spring6.bean.Studentproperty namename value张三/property nameclazz refclazzBean/!--级联属性赋值--property nameclazz.name value高三一班//beanbean nameclazzBean classcom.bjpowernode.spring6.bean.Clazz / /beans 执行结果 3.5 注入数组 这里主要学习两种情况数组中的元素是简单类型和当数组中的元素是非简单类型 Woman类作为非简单类型 package com.bjpowernode.spring6.bean;public class Woman {private String name;Overridepublic String toString() {return Woman{ name name \ };}public void setName(String name) {this.name name;} }QY类里面包含简单类型和非简单类型的数组属性 package com.bjpowernode.spring6.bean;import java.util.Arrays;public class QY {// 简单类型的数组private String[] loves;// 非简单类型的数组private Woman[] women;Overridepublic String toString() {return QY{ loves Arrays.toString(loves) , women Arrays.toString(women) };}public void setLoves(String[] loves) {this.loves loves;}public void setWomen(Woman[] women) {this.women women;} }spring-array.xml配置 当属性是数组时需要先使用一下array标签在array标签中再写value和ref标签进行赋值 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--准备好非简单类型数据--bean idw1 classcom.bjpowernode.spring6.bean.Womanproperty namename value小花//beanbean idw2 classcom.bjpowernode.spring6.bean.Womanproperty namename value小红//bean!--简单类型--bean idyqBean classcom.bjpowernode.spring6.bean.QY!-- 注入简单类型--property namelovesarrayvalue抽烟/valuevalue喝酒/valuevalue烫头/value/array/property!--注入非简单类型--property namewomen arrayref beanw1/ref beanw2//array/property/bean/beans 编写测试 package com.bjpowernode.spring6.test;import com.bjpowernode.spring6.bean.Clazz; import com.bjpowernode.spring6.bean.QY; import com.bjpowernode.spring6.bean.Student; import com.bjpowernode.spring6.bean.User; import com.bjpowernode.spring6.jdbc.MyDateSource; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext;public class SetDITest {Testpublic void testArraySet(){ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-array.xml);QY yqBean applicationContext.getBean(yqBean, QY.class);System.out.println(yqBean);}}执行结果 要点 如果数组中是简单类型使用value标签。 如果数组中是非简单类型使用ref标签。 3.6 注入List集合和Set集合 Person类 package com.bjpowernode.spring6.bean;import java.util.List; import java.util.Set;public class Person {// 注入Listprivate ListString names;// 注入Set集合private SetString addrs;Overridepublic String toString() {return Person{ names names , addrs addrs };}public void setNames(ListString names) {this.names names;}public void setAddrs(SetString addrs) {this.addrs addrs;} }spring-collection.xml配置 如果是List集合或者Set集合的属性需要先使用list标签和set标签标签中再写value和ref标签进行赋值 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean idpersonBean classcom.bjpowernode.spring6.bean.Person!--List集合--property namenameslistvalue张三/valuevalue李四/valuevalue张三/valuevalue王五/value/list/property!--Set集合--property nameaddrssetvalue张三/valuevalue李四/valuevalue张三/valuevalue王五/value/set/property/bean /beans 编写测试 package com.bjpowernode.spring6.test;import com.bjpowernode.spring6.bean.*; import com.bjpowernode.spring6.jdbc.MyDateSource; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext;public class SetDITest {Testpublic void testCollectionSet(){ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-collection.xml);Person personBean applicationContext.getBean(personBean, Person.class);System.out.println(personBean);}}执行结果 从执行结果上看可以得出List集合是有序可重复、Set集合是无序不可重复 注意注入List集合的时候使用list标签注入Set集合的时候使用set标签如果集合中是简单类型使用value标签反之使用ref标签。 3.7 注入Map和Properties集合 Properties集合本质上也是一个Map集合但是Properties集合的key和value只能是String类型并且注入的方式也是与Map集合不同的 Man类 package com.bjpowernode.spring6.bean;import java.util.Map; import java.util.Properties;public class Man {// 注入Map集合private MapString,Integer phones;// 注入Propertiesprivate Properties properties;Overridepublic String toString() {return Man{ phones phones , properties properties };}public void setProperties(Properties properties) {this.properties properties;}public void setPhones(MapString, Integer phones) {this.phones phones;} }spring-collection.xml配置 如果是Map集合的属性使用map标签嵌套entry子标签不使用ref和value标签了 如果是Map集合的属性使用props标签嵌套pro标签 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean idmanBean classcom.bjpowernode.spring6.bean.Man!--Map集合--property namephonesmapentry key张三 value123/entry key李四 value456/entry key王五 value789//map/property!-- Properties集合--property namepropertiespropsprop keydrivercom.mysql.jdbc.driver/propprop keyurljdbc:mysql://localhost:3306/spring6/prop/props/property/bean/beans 执行结果 要点 对于Map集合使用map标签对于Properties使用props标签嵌套prop标签完成。 如果key是简单类型使用 key 属性反之使用 key-ref 属性。 如果value是简单类型使用 value 属性反之使用 value-ref 属性。 3.8 注入null和空字符串 Cat类 package com.bjpowernode.spring6.bean;public class Cat {private String name;private int age;Overridepublic String toString() {return Cat{ name name \ , age age };}public void setName(String name) {this.name name;}public void setAge(int age) {this.age age;} }set-di.xml配置 ①注入空字符串使用value/ 或者 value。 ②注入null使用null/ 或者 不为该属性赋值。 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean idcarBean classcom.bjpowernode.spring6.bean.Cat!--注入null--!--第一种方法不为该属性赋值--property namename value张三/!--第二种方法使用null标签手动注入null--property namenamenull//propertyproperty nameage value18/!-- 注入空字符串--!--第一种方法--property namename value/!--第二种方法--property namenamevalue//propertyproperty nameage value20//bean/beans 3.9 注入的值中含有特殊符号 1XML中有5个特殊字符分别是、、、、 2以上5个特殊符号在XML中会被特殊对待会被当做XML语法的一部分进行解析如果这些特殊符号直接出现在注入的字符串当中会报错。 Math类 package com.bjpowernode.spring6.bean;public class Math {private String result;Overridepublic String toString() {return Math{ result result \ };}public void setResult(String result) {this.result result;} }math.xml配置 解决方案包括两种 第一种特殊符号使用转义字符代替。 第二种将含有特殊符号的字符串放到![CDATA[]] 当中。因为放在CDATA区中的数据不会被XML文件解析器解析。 注使用![CDATA[]]的方式只能使用value标签的形式不能使用value属性 注![CDATA[]]是XML的语法放在这里面的东西不会被XML解析器解析 5个特殊字符对应的转义字符分别是 特殊字符 转义字符 gt; lt; apos; quot; amp; ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean idmathBean classcom.bjpowernode.spring6.bean.Math!--直接写23会报错--!-- property nameresult value23/--!--第一种解决方案使用实体符号代替特殊符号--property nameresult value2 lt; 3/!--第二种解决方案![CDATA[]]--property nameresult!--只能使用value标签--value![CDATA[23]]/value/property/bean /beans 4. p命名空间注入 1p命名空间是简化set方法注入的。 2使用p命名空间注入的前提条件包括两个 第一在XML头部信息中添加p命名空间的配置信息xmlns:phttp://www.springframework.org/schema/p 第二p命名空间注入还是基于set注入的只不过p命名空间注入可以让spring配置变的更加简单所以需要对应的属性提供setter方法。 Dog类提供了setter方法 package com.bjpowernode.spring6.bean;import java.util.Date;public class Dog {private String name;private int age;// 虽然简单类型但是一般都是当做非简单类型对待private Date date;Overridepublic String toString() {return Dog{ name name \ , age age , date date };}public void setName(String name) {this.name name;}public void setAge(int age) {this.age age;}public void setDate(Date date) {this.date date;} }spring-p.xml配置 ①在spring的配置文件头部添加p命名空间。 ②使用在bean标签中的class属性后面直接使用对于简单类型属性赋值 p:属性名 属性值对于非简单类型属性赋值p:属性名-ref 属性值。 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:phttp://www.springframework.org/schema/pxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--原来注入的方式--bean iddogBean classcom.bjpowernode.spring6.bean.Dogproperty namename value大黄/property nameage value3/property namedate refnowDate//bean!--p命名注入方式--bean iddogBean classcom.bjpowernode.spring6.bean.Dog p:name大黄 p:age3 p:date-refnowDate/bean idnowDate classjava.util.Date/ /beans 测试程序 package com.bjpowernode.spring6.test;import com.bjpowernode.spring6.bean.Dog; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext;public class PTest {Testpublic void testPTest(){ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-p.xml);Object dogBean applicationContext.getBean(dogBean, Dog.class);System.out.println(dogBean);} }执行结果 如果把setter方法注释掉会报错 5.  c命名空间注入 1c命名空间是简化构造方法注入的。 2使用c命名空间的两个前提条件 ①第一需要在xml配置文件头部添加信息 xmlns:chttp://www.springframework.org/schema/c ②第二需要提供构造方法。 MyTime类提供了构造方法 package com.bjpowernode.spring6.bean;public class MyTime {private int year;private int month;private int day;public MyTime(int year, int month, int day) {this.year year;this.month month;this.day day;}Overridepublic String toString() {return MyTime{ year year , month month , day day };} }spring-c.xml配置 ①在spring的配置文件头部添加c命名空间。 ②使用c:_0 下标方式或者c:name 参数名方式。 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:chttp://www.springframework.org/schema/cxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--原来注入的方式--bean idmyTimeBean classcom.bjpowernode.spring6.bean.MyTimeconstructor-arg index0 value2022/constructor-arg index1 value1/constructor-arg index2 value14//bean!--c命名注入方式--bean idmyTimeBean classcom.bjpowernode.spring6.bean.MyTime c:_02022 c:_11 c:_214 //beans 测试程序 package com.bjpowernode.spring6.test;import com.bjpowernode.spring6.bean.MyTime; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext;public class CTest {Testpublic void testCDI(){ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-c.xml);MyTime myTimeBean applicationContext.getBean(myTimeBean, MyTime.class);System.out.println(myTimeBean);} }执行结果 如果把构造方法注释掉 注意不管是p命名空间还是c命名空间注入的时候都可以注入简单类型以及非简单类型。 6. util命名空间 1使用util命名空间可以让配置复用。 2使用util命名空间的前提是在spring配置文件头部添加配置信息。如下 3假设系统集成不同厂家的连接池这里用自己写的数据源来代替里面的连接数据库的配置实际上是相同的所以我们就可以使用util命名空间进行配置复用 数据源MyDataSource1 package com.bjpowernode.spring6.jdbc;import javax.sql.DataSource; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.Properties; import java.util.logging.Logger;public class MyDateSource1 implements DataSource {// 连接数据库的信息放到成员变量里/*private String driver;private String url;private String username;private String password;*/// 当然也可以放到一个Properties集合当中private Properties properties;public void setProperties(Properties properties) {this.properties properties;}Overridepublic String toString() {return MyDateSource1{ properties properties };}Overridepublic Connection getConnection() throws SQLException {return null;}Overridepublic Connection getConnection(String username, String password) throws SQLException {return null;}Overridepublic PrintWriter getLogWriter() throws SQLException {return null;}Overridepublic void setLogWriter(PrintWriter out) throws SQLException {}Overridepublic void setLoginTimeout(int seconds) throws SQLException {}Overridepublic int getLoginTimeout() throws SQLException {return 0;}Overridepublic Logger getParentLogger() throws SQLFeatureNotSupportedException {return null;}Overridepublic T T unwrap(ClassT iface) throws SQLException {return null;}Overridepublic boolean isWrapperFor(Class? iface) throws SQLException {return false;} }spring-util.xml配置未使用util命名空间 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--数据源1--bean idds1 classcom.bjpowernode.spring6.jdbc.MyDateSource1property namepropertiespropsprop keydirvercom.mysql.jdbc.Driver/propprop keyurljdbc:mysql://localhost:3306/spring6/propprop keyusernameroot/propprop keypassword123456/prop/props/property/bean!--数据源2--bean idds2 classcom.bjpowernode.spring6.jdbc.MyDateSource2property namepropertiespropsprop keydirvercom.mysql.jdbc.Driver/propprop keyurljdbc:mysql://localhost:3306/spring6/propprop keyusernameroot/propprop keypassword123456/prop/props/property/bean /beans spring-util.xml配置使用util命名空间把公共的配置使用util命名 使用util命名空间后把重复的配置放到util:properties标签里面并设置唯一标识id后面如果想使用直接使用ref属性直接引入id即可。 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:utilhttp://www.springframework.org/schema/utilxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd!--使用util命名--util:properties idpropprop keydirvercom.mysql.jdbc.Driver/propprop keyurljdbc:mysql://localhost:3306/spring6/propprop keyusernameroot/propprop keypassword123456/prop/util:properties!--数据源1--bean idds1 classcom.bjpowernode.spring6.jdbc.MyDateSource1property nameproperties refprop //bean!--数据源2--bean idds2 classcom.bjpowernode.spring6.jdbc.MyDateSource2property nameproperties refprop//bean /beans 测试代码 package com.bjpowernode.spring6.test;import com.bjpowernode.spring6.jdbc.MyDateSource1; import com.bjpowernode.spring6.jdbc.MyDateSource2; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext;public class UtilTest {Testpublic void testUtilTest(){ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-util.xml);MyDateSource1 ds1 applicationContext.getBean(ds1, MyDateSource1.class);MyDateSource2 ds2 applicationContext.getBean(ds2, MyDateSource2.class);System.out.println(ds1);System.out.println(ds2);} }执行结果 实际上util命名空间主要是针对集合的 7. 基于XML的自动装配byName byType Spring还可以完成自动化的注入自动化注入又被称为自动装配。它可以根据名字byName进行自动装配也可以根据类型byType进行自动装配。 UserDao类 package com.bjpowernode.spring6.dao;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class UserDao {private static final Logger logger LoggerFactory.getLogger(UserDao.class);public void insert(){logger.info(数据库正在保存用户信息);} }UserDaoService类 package com.bjpowernode.spring6.service;import com.bjpowernode.spring6.dao.UserDao;public class UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao userDao;}public void saveUser(){// 调用UserDao保存用户信息userDao.insert();} }7.1 根据名称byName自动装配 下面这个配置起到关键作用 1UserService Bean中需要添加autowirebyName表示通过名称进行装配。 2如果是正常的装配UserDao的id随便写只要和上面ref的值对应着就行 3如果是自动装配UserDao的id必须是UserService类中的UserDao属性对应的setUserDaoset方法方法去掉前面的set后面首字母变成小写的值userDao 4所以根据名称自动配置本质上也是set注入 spring-autowire.xml配置 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--正常的装配--bean iduserServiceBean classcom.bjpowernode.spring6.service.UserServiceproperty nameuserDao refuserDaoBean//beanbean iduserDaoBean classcom.bjpowernode.spring6.dao.UserDao/!--根据名称自动装配--bean iduserServiceBean classcom.bjpowernode.spring6.service.UserService autowirebyName/bean iduserDao classcom.bjpowernode.spring6.dao.UserDao/ /beans 编写测试 package com.bjpowernode.spring6.test;import com.bjpowernode.spring6.service.UserService; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext;public class AutowireTest {Testpublic void testAutowireTest(){ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-autowire.xml);UserService userServiceBean applicationContext.getBean(userServiceBean, UserService.class);userServiceBean.saveUser();} }执行结果 正常执行说明如果根据名称装配(byName)底层会调用set方法进行注入例如setAge() 对应的名字是agesetPassword()对应的名字是passwordsetEmail()对应的名字是email。 7.2 根据类型byType自动装配 1其实无论是根据名称自动装备byName还是根据类型制动装备byType在装配的时候都是基于set方法的所以set方法是必须要提供的 2根据byType自动装配时对于被注入的对象只需要使用bean标签指定要注入的类型不需要再指定id。 spring-autowire.xml配置 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--根据类型自动装备--bean iduserServiceBean classcom.bjpowernode.spring6.service.UserService autowirebyType/bean classcom.bjpowernode.spring6.dao.UserDao/ /beans 执行结果 如果byType根据类型装配时如果配置文件中有两个类型一样的bean会出现什么问题呢 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--两个类型一样的bean--bean idx classcom.bjpowernode.spring6.dao.UserDao/bean idy classcom.bjpowernode.spring6.dao.UserDao/bean iduserServiceBean classcom.bjpowernode.spring6.service.UserService autowirebyType/ /beans 执行结果  测试结果说明了当byType进行自动装配的时候配置文件中某种类型的Bean必须是唯一的不能出现多个 8. Spring引入外部属性配置文件使用context命名空间 我们都知道编写数据源的时候是需要连接数据库的信息的例如driver、url、username password等信息。这些信息可以单独写到一个属性配置文件中吗这样用户修改起来会更加的方便当然是可以的使用context命名空间 第一步写一个数据源类提供相关属性 package com.bjpowernode.spring6.jdbc;import javax.sql.DataSource; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.logging.Logger;public class MyDateSource implements DataSource {private String driver;private String url;private String username;private String password;public void setDriver(String driver) {this.driver driver;}public void setUrl(String url) {this.url url;}public void setUsername(String username) {this.username username;}public void setPassword(String password) {this.password password;}Overridepublic String toString() {return MyDateSource{ driver driver \ , url url \ , username username \ , password password \ };}Overridepublic Connection getConnection() throws SQLException {return null;}Overridepublic Connection getConnection(String username, String password) throws SQLException {return null;}Overridepublic PrintWriter getLogWriter() throws SQLException {return null;}Overridepublic void setLogWriter(PrintWriter out) throws SQLException {}Overridepublic void setLoginTimeout(int seconds) throws SQLException {}Overridepublic int getLoginTimeout() throws SQLException {return 0;}Overridepublic Logger getParentLogger() throws SQLFeatureNotSupportedException {return null;}Overridepublic T T unwrap(ClassT iface) throws SQLException {return null;}Overridepublic boolean isWrapperFor(Class? iface) throws SQLException {return false;} }第二步在类路径下新建jdbc.properties文件并配置信息 drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/spring6 usernameroot password123456 第三步在spring-properties.xml配置文件中引入context命名空间 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd/beans 第四步在spring中配置使用jdbc.properties文件 第一步引入context命名空间前面已经引过了。 第二步使用context:property-placeholder标签的location属性来指定属性配置文件的路径。 location默认从类的根路径下开始加载资源。 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd!--引入外部的properties文件--context:property-placeholder locationjdbc.properties/bean iddataSource classcom.bjpowernode.spring6.jdbc.MyDateSource!--使用$元符号${key}--property namedriver value${driver}/property nameurl value${url}/property nameusername value${username}/property namepassword value${password}//bean /beans 测试程序 package com.bjpowernode.spring6.test;import com.bjpowernode.spring6.jdbc.MyDateSource; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext;public class JDBCPropertiesTest {Testpublic void testProperties(){ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-properties.xml);MyDateSource dataSource applicationContext.getBean(dataSource, MyDateSource.class);System.out.println(dataSource);} }执行结果 这里username怎么不是我们配置文件里的spring通过${}加载默认是是先加载windows系统的环境变量 怎么解决一般在所有配置前面加上jdbc前缀 jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/spring6 jdbc.usernameroot jdbc.password123456 执行结果
http://www.hkea.cn/news/14532522/

相关文章:

  • 大气产品展示网站源码免费做优化的网站
  • 长沙做网站有哪些做家教网站
  • 樟树有哪几个网站做爆药库wordpress对比discuz
  • 网站地图有哪些网址网站制作客户资料
  • 开封网站建设优化东莞长安网站优化
  • 天津网站建设招聘网站公司郑州
  • 2022热点新闻事件厦门网站流量优化价格
  • 网站结构及内容建设策略站长 网站对比
  • frontpage导入网站关于进一步加强门户网站建设
  • 腾讯微博做网站外链步骤工程建设室内涂料招投标网站
  • 网站建设中 动画做网站客户尾款老不给怎么办
  • 许昌 网站建设网站推广的方法是什么
  • ps制作网站首页教程网络营销方法有几种类型
  • 济南集团网站建设流程网站建设销售渠道
  • 口碑好网站建设定制泡泡资源网
  • 如何在自己建设的网站上发表文章编程教学
  • 北京网站设计方案今天重庆新闻
  • 阿里巴巴吧国际网站怎么做php推送示例wordpress
  • 网站app建设图片素材甘肃省第九建设集团网站
  • 高德地图看不了国外厦门关键词排名seo
  • 帝国cms下载类网站怎么做买东西的网站
  • ie浏览器官方网址入口seo推广介绍
  • 上海网站建设最好的公司排名旅游搜索网站开发
  • 网站开发流程简述龙岗网站改版
  • 阿里云模板建站怎么样php网站开发模式有哪些
  • apache怎么配置网站唐山房地产网站建设
  • 网站软件应用大全网站建设如何开票
  • 商城网站建设视频wordpress浏览量排序
  • 如何做360搜索网站宝安网站设计制作
  • 网站悬浮qqwordpress2016免费主题