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

在国外做盗版电影网站吗企业营销策划推广

在国外做盗版电影网站吗,企业营销策划推广,互联网获客,wordpress4.8.3中文本篇文章是对这两天所学的内容做一个总结#xff0c;涵盖我这两天写的所有笔记#xff1a; 【Spring】 Spring中的IoC#xff08;控制反转#xff09;【Spring】Spring中的DI#xff08;依赖注入#xff09;Dependence Import【Spring】bean的基础配置【Spring】bean的实…本篇文章是对这两天所学的内容做一个总结涵盖我这两天写的所有笔记 【Spring】 Spring中的IoC控制反转【Spring】Spring中的DI依赖注入Dependence Import【Spring】bean的基础配置【Spring】bean的实例化【Spring】bean的生命周期【Spring】依赖注入方式DI的方式【Spring】使用三方包进行数据源对象数据库管理【Spring】加载properties文件【Spring】IoC容器的一些总结与补充 文章目录 1. 控制反转与依赖注入的定义为什么需要控制反转Spring中怎么做控制反转第一步pom.xml引入相关依赖第二步在Resource文件下创建Spring Config File也就是配置IoC容器的内容并配置bean第三步在代码中调用IoC容器并获取具体的bean 为什么需要依赖注入如何进行依赖注入Setter注入引用类型和简单类型第一步删除ServiceImpl中的new创建方式建立set方法使得可以对ServiceImpl中的属性做修改第二步在配置文件中写明使用什么类别给bookDao属性做注入第三步测试 构造器注入简单类型和引用类型第一步删除ServiceImpl中的new创建方式无需set方法通过构造方法对ServiceImpl中的属性做修改第二步在配置文件中写明使用什么类别给构造方法第三步测试 构造器注入的参数适配了解通常不用这些方法依赖注入方式选择依赖自动装配通过autowire属性指定类型按类型注入autowirebyType按名称注入autowirebyName自动装配注意事项 集合注入在集合中注入简单类型——value在集合中注入引用类型——ref 控制反转与依赖注入的关系 2. bean的配置bean的别名配置——name属性配置bean的单例多例——scope属性配置bean为什么默认为单例bean的作用范围说明 bean的实例化构造方法静态工厂实例工厂FactoryBean bean的生命周期在类中提供生命周期控制方法并在配置文件中配置init-methoddestroy-method配置通过ctx.close()执行IoC容器关闭通过注册关闭钩子执行IoC容器关闭 实现接口来做和init和destroy接口bean的生命周期执行顺序 3. 使用第三方包进行数据源的管理例子使用com.alibaba.druid进行数据库连接第一步在pom.xml中导入坐标第二步在bean中配置连接 4. 在配置文件中读取properties文件中的属性第一步建立jdbc.properties文件内容如下第二步开启context命名空间第三步使用context命名空间加载指定properties文件第四步使用${}读取加载的属性值其他问题 5. 关于IoC容器其他内容的总结与补充创建容器的两种方式相对路径导入绝对路径导入 获取Bean的三种方式获取后强转类型在获取时指定类型通过类型获取Bean 容器类层次结构图BeanFactory 6. 复习内容 1. 控制反转与依赖注入的定义 为什么需要控制反转 我们在传统写业务层的时候需要给业务层中的属性通过new操作生成对象。 public class BookServiceImpl implements BookService{private BookDao bookDao new BookDaoImpl();public void save(){bookDao.save()} }假如某一天我不再希望使用BookDaoImpl这个实现类而是希望使用BookDaoImpl2这个实现类我们就需要再次修改代码重新修改BookServiceImpl中bookDao属性的初始化。这样子的修改方式就不是太合理耦合度较高。 如果我们可以将这种主动式产生对象转换为由外部指定产生对象就可以减少这种修改降低耦合度通俗的说就是将对象的创建控制权由程序转移到外部这就是控制反转(IoC, Inversion of Control)。 Spring中怎么做控制反转 Spring实现了IoC此处介绍基于配置来写IoC 第一步pom.xml引入相关依赖 引入相关依赖刷新maven dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactId /dependency第二步在Resource文件下创建Spring Config File也就是配置IoC容器的内容并配置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!--1. 导入spring的坐标spring-context--!--2. 配置bean--!--bean标签标示配置beanid属性标示给bean起名字class属性标示给bean定义的类型--bean idbookDao classcom.example.demo231116.dao.impl.BookDaoImpl /bean idbookService classcom.example.demo231116.service.impl.BookServiceImpl / /beans第三步在代码中调用IoC容器并获取具体的bean public class Demo231116Application2 {public static void main(String[] args) {// 3. 获取IoC容器ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);// 4. 获取beanBookService bookService (BookService) ctx.getBean(bookService);bookService.save();} }为什么需要依赖注入 在上面给出的BookServiceImpl.java代码中有一个bookDao的属性我们定义为 private BookDao bookDao new BookDaoImpl();我们想要通过IoC去管理bean为了真正实现解耦我们不再保留new形式创建的Dao对象这时候我们就需要使用依赖注入来完成这一点 如何进行依赖注入 思考两个问题 Service中需要的Dao对象如何进入到Service中提供方法使得我们可以修改Service中的Dao对象Service与Dao间的关系如何描述通过配置的形式来描述 基于以上两个问题及答案我们总结了不同的注入方式 Setter注入引用类型和简单类型 第一步删除ServiceImpl中的new创建方式建立set方法使得可以对ServiceImpl中的属性做修改 public class BookServiceImpl implements BookService {// 删除原本的new方法给bookDao设置一个setter方法public void setBookDao(BookDao bookDao) {this.bookDao bookDao;}public void setBookName(String bookName) {this.bookName bookName;}private BookDao bookDao;private String bookName;public void save(){System.out.println(book service save... bookName: this.bookName);bookDao.save();}}第二步在配置文件中写明使用什么类别给bookDao属性做注入 在配置文件中在bookService的bean内部配置property该标签表示配置当前bean的属性其中name表示配置哪一个具体属性ref表示引用类型参照的具体beanvalue则是简单类型的对应值 ?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 idbookDao classcom.example.demo231116.dao.impl.BookDaoImpl /bean idbookService classcom.example.demo231116.service.impl.BookServiceImplproperty namebookDao refbookDao/property namebookName valuebkName!!! //bean /beans第三步测试 运行如下代码 public class Demo231116Application2 {public static void main(String[] args) {// 获取IoC容器ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);BookService bookService (BookService) ctx.getBean(bookService);bookService.save();} }结果为 book service save... bookName:bkName!!! book dao save...构造器注入简单类型和引用类型 第一步删除ServiceImpl中的new创建方式无需set方法通过构造方法对ServiceImpl中的属性做修改 public class BookServiceImpl implements BookService {private BookDao bookDao;private String bookName;// 删除原本的new方法给bookDao设置一个setter方法public BookServiceImpl(BookDao bookDao, String bookName){this.bookDao bookDao;this.bookName bookName;}public void save(){System.out.println(book service save... bookName: this.bookName);bookDao.save();} }第二步在配置文件中写明使用什么类别给构造方法 在配置文件中在bookService的bean内部配置constructor-arg该标签表示构造方法的参数其中name表示配置哪一个具体属性ref表示引用类型参照的具体beanvalue则是简单类型的对应值 ?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 idbookDao classcom.example.demo231116.dao.impl.BookDaoImpl /bean idbookService classcom.example.demo231116.service.impl.BookServiceImplconstructor-arg namebookDao refbookDao/constructor-arg namebookName valuebkName!!! //bean /beans第三步测试 运行如下代码 public class Demo231116Application2 {public static void main(String[] args) {// 获取IoC容器ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);BookService bookService (BookService) ctx.getBean(bookService);bookService.save();} }结果为 book service save... bookName:bkName!!! book dao save...构造器注入的参数适配了解通常不用这些方法 配置中使用constructor-arg的标签type属性按形参类型注入为了解耦避免配置和name耦合 ?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 idbookDao classcom.example.demo231116.dao.impl.BookDaoImpl /bean idbookService classcom.example.demo231116.service.impl.BookServiceImplconstructor-arg typecom.example.demo231116.dao.bookDao refbookDao/constructor-arg typejava.lang.String valuebkName!!! //bean /beans配置中使用constructor-arg的标签index属性按形参位置注入为了解决有同样类型的参数的问题 ?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 idbookDao classcom.example.demo231116.dao.impl.BookDaoImpl /bean idbookService classcom.example.demo231116.service.impl.BookServiceImplconstructor-arg index0 refbookDao/constructor-arg index1 valuebkName!!! //bean /beans依赖注入方式选择 建议使用setter注入 第三方技术根据情况选择 依赖自动装配通过autowire属性指定类型 根据bean所依赖的资源在容器中自动查找并注入到bean的过程为自动装配 自动装配的方式通过autowire指定有四种类型 按类型常用按名称按构造方法不启用自动装配 注意想要让IoC容器实现自动装配必须给这些属性配置setter方法 按类型注入autowirebyType 此时配置BookServiceImpl的代码应该这么写 ?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 idbookDao classcom.example.demo231116.dao.impl.BookDaoImpl /bean iduserDao classcom.example.demo231116.dao.impl.UserDaoImpl /bean idbookService classcom.example.demo231116.service.impl.BookServiceImpl autowirebyType / /beansbean的类型指向必须唯一推荐使用。 假如配置了两个指向同一类型id不同的bean执行报错会提示找到了两个bean不知道匹配哪一个。 按名称注入autowirebyName 此时配置BookServiceImpl的代码应该这么写 ?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 idbookDao classcom.example.demo231116.dao.impl.BookDaoImpl /bean iduserDao classcom.example.demo231116.dao.impl.UserDaoImpl /bean idbookService classcom.example.demo231116.service.impl.BookServiceImpl autowirebyName / /beans属性的名称要能够在配置的bean中的id对应的上。此方式因变量名与配置耦合不推荐使用。 自动装配注意事项 自动装配用于引用类型依赖注入不能对简单类型操作因为简单类型你可以有很多不同的值除非一个一个写自动装配优先级低于setter注入和构造器注入同时出现时自动装配无效 集合注入 关于array、list、set、map、properties的注入 假如BookDaoImpl.java代码如下 package com.example.demo.dao.impl;import com.example.demo.dao.BookDao;import java.util.*;public class BookDaoImpl implements BookDao {private int[] array;private ListString list;private SetString set;private MapString, String map;private Properties properties;Overridepublic void save() {System.out.println(book dao save...);System.out.println(遍历数组 Arrays.toString(array));System.out.println(遍历List list);System.out.println(遍历set set);System.out.println(遍历Map map);System.out.println(遍历properties properties);}public void setProperties(Properties properties) {this.properties properties;}public void setMap(MapString, String map) {this.map map;}public void setSet(SetString set) {this.set set;}public void setList(ListString list) {this.list list;}public void setArray(int[] array) {this.array array;} }在集合中注入简单类型——value 配置文件需要如下配置 bean idbookDao classcom.example.demo.dao.impl.BookDaoImplproperty namearrayarrayvalue100/valuevalue200/valuevalue300/value/array/propertyproperty namelistlistvaluea/valuevalueb/valuevaluec/value/list/propertyproperty namesetsetvaluec/valuevaluec/valuevalued/value/set/propertyproperty namemapmapentry keycountry valuechina /entry keyprovince valueguangdong /entry keycity valueshenzhen //map/propertyproperty namepropertiespropsprop keycountrychina/propprop keyprovincehenan/propprop keycitykaifeng/prop/props/property /bean其中set属性自动过滤元素如果执行以下java代码 public class Demo231116Application2 {public static void main(String[] args) {// 获取IoC容器ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);BookService bookService (BookService) ctx.getBean(bookService);bookService.save();} }则结果如下 book service save... book dao save... 遍历数组[100, 200, 300] 遍历List[a, b, c] 遍历set[c, d] 遍历Map{countrychina, provinceguangdong, cityshenzhen} 遍历properties{countrychina, provincehenan, citykaifeng}在集合中注入引用类型——ref 只需去掉简单类型的value属性使用ref属性 bean idbookDao classcom.example.demo.dao.impl.BookDaoImplproperty namearrayarrayref beanbeanId /ref beanbeanId /ref beanbeanId //array/property /bean控制反转与依赖注入的关系 这部分我也思考了一下认为网上有句话说的很对简单地说控制反转是一种设计思想而依赖注入是控制反转思想的一种实现方式。 我认为实际上控制反转就是我们将已有的类别放置到IoC容器中便于让外部进行处理。而依赖注入是真正将具体的类别给属性完成注入的方式。 2. bean的配置 bean的别名配置——name属性配置 通过name属性进行name的别名配置 ?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 idbookDao namedao classcom.example.demo231116.dao.impl.BookDaoImpl //beans这样当我们在主代码里调用ctx.getBean(bookDao)和ctx.getBean(dao)起到的效果是相同的 package com.example.demo231116;import com.example.demo231116.dao.BookDao; import com.example.demo231116.service.BookService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class Demo231116Application2 {public static void main(String[] args) {// 获取IoC容器ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);BookDao bookDao (BookDao) ctx.getBean(bookDao);bookDao (BookDao) ctx.getBean(dao);bookDao.save();} }bean的单例多例——scope属性配置 若保持别名配置里那样的bean配置我们生成出来的bean是单例的当我们执行以下代码 BookDao bookDao (BookDao) ctx.getBean(dao); BookDao bookDao1 (BookDao) ctx.getBean(dao); System.out.println(bookDao); System.out.println(bookDao1);会得到结果 com.example.demo231116.dao.impl.BookDaoImpl309e345f com.example.demo231116.dao.impl.BookDaoImpl309e345f两个对象出自同一个实例但如果我们不希望它是以单例形式创建而是以多例形式创建的时候我们需要配置scope属性 ?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 idbookDao namedao classcom.example.demo231116.dao.impl.BookDaoImpl scopeprototype //beansscope有两个属性singleton单例(默认)prototype非单例 配置scope属性后再执行上面的代码会得到结果 com.example.demo231116.dao.impl.BookDaoImpl309e345f com.example.demo231116.dao.impl.BookDaoImpl56a6d5a6两个对象不出自同一个实例 bean为什么默认为单例 如果每创建一个对象都是不同的实例那么对内存的消耗会很大 bean的作用范围说明 适合交给容器管理的bean表现层对象、业务层对象、数据层对象、工具对象 不适合交给容器管理的bean封装实体的域对象 bean的实例化 构造方法 当我们在Spring Config文件中配置 bean idbookDao namedao classcom.example.demo231116.dao.impl.BookDaoImpl /这种bean的实例化默认调用无参构造方法对于写有参构造对有参构造中参数的注入则是上面依赖注入的部分 静态工厂 假如写了一个BookDao工厂BookDaoFactory.java package com.example.demo231116.factory;import com.example.demo231116.dao.BookDao; import com.example.demo231116.dao.impl.BookDaoImpl;public class BookDaoFactory {public static BookDao getBookDao(){System.out.println(Factory method....);return new BookDaoImpl();} }我们想让bean通过调用这个工厂方法返回里面的BookDaoImpl则需要如下配置 bean idbookDaoFactory classcom.example.demo231116.factory.BookDaoFactory factory-methodgetBookDao /id属性和class属性与之前差异不大分别为bean名称和bean类别而factory-method指定具体地工厂方法 实例工厂 注意实例工厂与静态工厂的区别是实例工厂中的方法不是静态方法 静态方法和非静态方法的区别是 静态方法可以在不建立该类对象的情况下通过类名.方法进行调用非静态方法需要建立该类对象后通过对象名.方法进行调用 详细可以看第4个笔记中的实验 假如写了一个BookDao工厂BookDaoFactory.java package com.example.demo231116.factory;import com.example.demo231116.dao.BookDao; import com.example.demo231116.dao.impl.BookDaoImpl;public class BookDaoFactory {public BookDao getBookDao(){System.out.println(Factory method....);return new BookDaoImpl();} }在配置文件中需要如下写 bean idbookDaoFactory2 classcom.example.demo231116.factory.BookDaoFactory / bean idbd factory-methodgetBookDaoUnstatic factory-beanbookDaoFactory2 /即先建立出工厂类的bean再建立下面这个使用该工厂方法的bean。factory-method指定其中具体的工厂方法factory-bean指定工厂方法所属的父类在最后调用的时候直接调用bd就可以完成初始化 BookDao bookDao3 (BookDao) ctx.getBean(bd); System.out.println(bookDao3);在这种方法里实际上我们创建出的bookFactory2这个bean没有被用到所以还有如下的方法FactoryBean FactoryBean 直接写一个工厂方法implement FactoryBean。FactoryBean是一个泛型方法指定其中的类型实现其方法 第一个getObject()返回具体地对象 第二个getObjectType()返回对象的类型 package com.example.demo231116.factory;import com.example.demo231116.dao.BookDao; import com.example.demo231116.dao.impl.BookDaoImpl; import org.springframework.beans.factory.FactoryBean;public class BookDaoFactoryBean implements FactoryBeanBookDao{Overridepublic BookDao getObject() throws Exception {return new BookDaoImpl();}Overridepublic Class? getObjectType() {return BookDao.class;} }如此在bean配置中只需要像原本普通的一行即可 bean idbookDaoFactoryMethod classcom.example.demo231116.factory.BookDaoFactoryBean /注意当我们执行以下代码后会发现打印出来的结果相同说明这是单例模式创建的。 BookDao bookDao4 (BookDao) ctx.getBean(bookDaoFactoryMethod); BookDao bookDao5 (BookDao) ctx.getBean(bookDaoFactoryMethod); System.out.println(bookDao4); System.out.println(bookDao5);如果我们想要该工厂方法返回的不是单例模式而是不同的实例则我们需要补充FactoryBean中的isSingleton()方法当这个方法设置为True时就是用单例模式创建的对象如果这个方法返回为False就不会使用单例模式每一次构造都会创建出新的对象 Override public boolean isSingleton() {return true; }bean的生命周期 假如我们希望在建立bean时候执行一些资源的初始化在bean销毁之前执行一些资源的销毁我们就会需要考虑到bean的声明周期通过以下方式进行生命周期的控制。 在类中提供生命周期控制方法并在配置文件中配置init-methoddestroy-method配置 定义实现类如下 package com.example.demo231116.dao.impl;import com.example.demo231116.dao.BookDao;public class BookDaoImpl implements BookDao {public void save(){System.out.println(book dao save...);}public void init(){System.out.println(book dao init...);}public void destroy(){System.out.println(book dao destroy...);} }配置时我们只需要指定具体的初始化方法init-method和销毁方法destroy-method即可 bean idbookDaoCycle classcom.example.demo231116.dao.impl.BookDaoImpl init-methodinit destroy-methoddestroy /这样当我们在主函数中执行 // IoC容器 ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);BookDao bookDao (BookDao) ctx.getBean(bookDaoCycle); System.out.println(bookDao);结果是 book dao init... com.example.demo231116.dao.impl.BookDaoImpl5dd6264这时候的疑问可能是为什么destroy方法没有被执行 答案是在程序执行结束之后IoC容器还没有执行关闭操作java虚拟机就已经强行关闭了。那么应该如何在java虚拟机关闭之前执行IoC容器关闭呢如下有两种方法 通过ctx.close()执行IoC容器关闭 ApplicationContext并没有close方法ApplicationContext下的一个接口ClassPathXmlApplicationContext才有定义close方法所以这里想要使用close方法需要修改IoC容器定义然后在末尾调用ctx.close() // IoC容器 ClassPathXmlApplicationContextctx new ClassPathXmlApplicationContext(applicationContext.xml);BookDao bookDao (BookDao) ctx.getBean(bookDaoCycle); System.out.println(bookDao);ctx.close()输出结果为 book dao init... com.example.demo231116.dao.impl.BookDaoImpl5dd6264 book dao destroy...但是如果是这样的话ctx.close()只能在程序的末尾写因为在开头定义结束就写的话这个IoC容器就被销毁了也不可能执行一些getBean的操作还有一个方法是通过注册钩子关闭IoC容器 通过注册关闭钩子执行IoC容器关闭 注册一个关闭钩子在不用强行关闭IoC容器的情况下设置在java虚拟机关闭之前让程序执行销毁的方法 ClassPathXmlApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml); ctx.registerShutdownHook();BookDao bookDao (BookDao) ctx.getBean(bookDaoCycle); System.out.println(bookDao);这样就不再需要强硬地执行ctx.close()方法了 实现接口来做和init和destroy接口 只需要在bean类下多实现InitializingBean和DisposableBean这两个接口并实现其中的afterPropertiesSet和destroy方法 package com.example.demo231116.dao.impl;import com.example.demo231116.dao.BookDao; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean;public class BookDaoImpl implements BookDao, InitializingBean, DisposableBean {public void save(){System.out.println(book dao save...);}Overridepublic void destroy() throws Exception {System.out.println(接口destroy);}Overridepublic void afterPropertiesSet() throws Exception {System.out.println(接口init);} }然后配置bean只需要简单地配置如下 bean idbookDaoCycle classcom.example.demo231116.dao.impl.BookDaoImpl /这个afterPropertiesSet的init方法是在先执行属性设置后再执行init方法 bean的生命周期执行顺序 初始化容器 创建对象内存分配 执行构造方法 执行属性注入setter注入 执行bean的初始化方法使用bean 执行业务操作关闭/销毁容器 执行bean的销毁方法 3. 使用第三方包进行数据源的管理例子使用com.alibaba.druid进行数据库连接 第一步在pom.xml中导入坐标 dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.21/version /dependency第二步在bean中配置连接 在这里首先应该查看这个Druid包给我们提供了一些什么方法。 先查看构造方法能否让我们通过构造注入写入一些配置信息但在具体查看后发现是没有的详细可见笔记7。 但观察到可以通过setter注入来写一些配置信息所以这里就使用setter注入 ?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 iddataSource classcom.alibaba.druid.pool.DruidDataSourceproperty nameurl valuejdbc:mysql://localhost:3306/ecommercedb/property nameusername valueroot/property namepassword value123456/property namedriverClassName valuecom.mysql.jdbc.Driver //bean /beans4. 在配置文件中读取properties文件中的属性 第一步建立jdbc.properties文件内容如下 jdbc.urljdbc:mysql://localhost:3306/ecommercedb jdbc.usernameroot jdbc.password123456 jdbc.driverClassNamecom.mysql.jdbc.Driver第二步开启context命名空间 我理解需要开辟新的命名空间是读取非工程文件中的内容而是读取外部文件中的内容 第三步使用context命名空间加载指定properties文件 在这一步中需要通过location写清楚加载properties文件的位置 第四步使用${}读取加载的属性值 第二——第四步具体代码如下最终只需要通过${}读取加载的属性值即可 ?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd!-- 1. 开启context命名空间-- !-- 2. 使用context空间加载properties文件--context:property-placeholder locationjdbc.properties/ !-- 3. 使用属性占位符${}读取properties文件中的属性--bean iddataSource classcom.alibaba.druid.pool.DruidDataSourceproperty nameurl value${jdbc.url}/property nameusername value${jdbc.username}/property namepassword value${jdbc.password}/property namedriverClassName value${jdbc.url} //bean /beans其他问题 假如在配置文件中写的是usernameroot而不是jdbc.usernameroot则可能使用${username}得到的结果并不会是root 是因为系统环境变量里面有和properties里面定义的变量重名则properties里面的变量不会被加载也就是说系统环境变量的优先级会比properties里面的变量优先级高。 为了使用properties里面面的变量而不是系统环境变量我们可以对xml配置文件让系统环境变量不被使用 context:property-placeholder locationjdbc.properties system-properties-modeNEVER/加载多个properties文件可以用逗号分隔 context:property-placeholder locationjdbc.properties, msg.properties/加载所有properties文件可以用正则*.properties context:property-placeholder location*.properties/以上写法不够标准标准的是classpath:*.properties context:property-placeholder locationclasspath:*.properties/如果不止要从工程中加载properties文件还要从jar包等中加载则写classpath*:*properties context:property-placeholder locationclasspath*:*.properties/第4、5种根据不同的需求来写 5. 关于IoC容器其他内容的总结与补充 创建容器的两种方式 相对路径导入 ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);绝对路径导入 ApplicationContext ctx new FileSystemXmlApplicationContext(E:\\Code\\Java\\SpringStudy\\project1\\src\\main\\resources\\applicationContext.xml);获取Bean的三种方式 获取后强转类型 BookDao bookDao (BookDao) ctx.getBean(bookDao);在获取时指定类型 BookDao bookDao (BookDao) ctx.getBean(bookDao, BookDao.class);通过类型获取Bean BookDao bookDao ctx.getBean(BookDao.class);容器类层次结构图 BeanFactory 这是最早的加载IoC容器的方法使用BeanFactory的方法如下 Resource resource new ClassPathResource(applicationContext.xml); BeanFactory bf new XmlBeanFactory(resource); BookDao bookDao bf.getBean(BookDao.class); bookDao.save();BeanFactory与我们现在ApplicationContext的区别在于 BeanFactory是延迟加载beanApplicationContext是立即加载bean 即前者在没有getBean的时候是不会提前执行类的构造方法的而Application就算没有getBean也会执行构造方法 如果想在ApplicationContext上实现延迟加载bean只需要加参数lazy-inittrue bean idbookDao classcom.example.project1.dao.impl.BookDaoImpl lazy-inittrue/6. 复习内容
http://www.sadfv.cn/news/51464/

相关文章:

  • 南京网站建设推南京网站建设设计临沂恒商做网站
  • p2p网站建设方案怎么自己做个网站
  • 网站上面怎么做链接化工网站建设公司
  • 西宁做网站北京建网
  • 企业网站建设深圳辽宁建设工程信息网抚顺
  • 网站建设需要摊销几年合肥小程序设计
  • 购物商场网站开发过程详细说明做现货黄金的金融网站
  • 代码添加在网站的什么位置济宁seo营销
  • 深圳工信部网站备案哈尔滨网页制作公司电话
  • 网站建设及维护干什么的百度电话
  • 网站百度地图生成器怎么自己设计logo
  • 如何用php做电商网站电子商务主要课程
  • 如何设计网站步骤西安到北京航班时刻表
  • 台州建设局网站企业黑名单云开放平台
  • 网站建设费要摊销吗精美wordpress模板
  • 该网站暂时无法访问404在线制作logo图标免费制作
  • 建行网站申请免费域名邮箱
  • 深圳建立网站营销设计园林景观设计公司抖音推广
  • 温岭 网站制作济南制作网站
  • 公司网站设计素材甘肃省建设厅执业资格注册网站
  • 网站设计背景图片天猫商城售后服务
  • 农业产品如何建网站怎么做网站10步骤
  • 网站自动更新时间代码wordpress怎么调用音频
  • 手机网站模板制作刚刚中国突然宣布
  • 网站建设需要照片吗天津地区个人网站备案
  • 找公司开发网站企业网站管理系统最新4湖南岚鸿牛x1 0
  • 自己做流媒体网站难网站卖了对方做违法吗
  • wordpress整站数据深圳企业网站建设推荐公司
  • 做服装公司需要什么网站google搜索中文入口
  • 个人可以做建站网站么求职seo服务