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

长治网站建设收费多少农村自建房设计图 户型图

长治网站建设收费多少,农村自建房设计图 户型图,创新的南昌网站建设,项目四网站建设实训报告目录 Spring简介发展史Spring Framework系统架构spring 核心概念IOC、IOC容器、Bean、DIIOC快速入门DI快速入门 IOCBean基础配置id与class属性name属性scope属性 Bean的实例化构造方法静态工厂实例工厂FactoryBean的使用#xff08;工厂实例的简化#xff09; Bean的生命周期… 目录 Spring简介发展史Spring Framework系统架构spring 核心概念IOC、IOC容器、Bean、DIIOC快速入门DI快速入门 IOCBean基础配置id与class属性name属性scope属性 Bean的实例化构造方法静态工厂实例工厂FactoryBean的使用工厂实例的简化 Bean的生命周期添加初始化和销毁方法close关闭容器注册钩子关闭容器关闭方式的区别通过接口来简化关闭容器 DIsetter注入注入引用数据类型注入简单数据类型 构造器注入构造器注入多个数据类型构造器注入多个简单数据类型解决构造函数中参数名紧耦合 自动装配什么是依赖自动装配自动装配的方式有哪些按照类型完成自动装配的配置按照名称完成自动注入装配的配置注意事项配置特征 集合注入加载 properties 文件读取单个属性 核心容器容器Bean 的三种获取方式容器类层次结构BeanFactory的使用 IOC/DI注解开发注解开发定义bean纯注解开发模式注解开发bean作用范围与生命周期管理bean的作用范围bean的生命周期 注解开发依赖注入注解实现按照类型注入注解实现按照名称注入简单数据类型注入注解读取 properties 配置文件 IOC/DI注解开发管理第三方bean注解开发管理第三方bean引入外部配置类使用包扫描引入使用Import注解引入 注解开发实现为第三方bean注入资源简单数据库类型引用数据类型 XML开发和注解的对比 Spring 官网Spring | Home 简介 随着时代发展软件规模与功能都呈几何式增长开发难度也在不断递增Spring可以简化开发降低企业级开发的复杂性使开发变得更简单快捷 随着项目规模与功能的增长,遇到的问题就会增多为了解决问题会引入更多的框架Spring可以框架整合高效整合其他技术提高企业级应用开发与运行效率 Spring发展到今天已经形成了一种开发的生态圈Spring提供了若干个项目每个项目用于完成特定的功能 Spring Framework: Spring框架是Spring中最早最核心的技术也是所有其他技术的基础。SpringBoot: Spring是来简化开发而SpringBoot是来帮助Spring在简化的基础上能更快速进行开发。SpringCloud: 这个是用来做分布式之微服务架构的相关开发。 发展史 IBM(IT公司-国际商业机器公司)在1997年提出了EJB思想,早期的JAVAEE开发大都基于该思想。Rod Johnson(Java和J2EE开发领域的专家)在2002年出版的Expert One-on-One J2EE Design and Development ,书中有阐述在开发中使用EJB该如何做。Rod Johnson在2004年出版的Expert One-on-One J2EE Development without EJB ,书中提 出了比EJB思想更高效的实现方案并且在同年将方案进行了具体的落地实现这个实现就是 Spring1.0。随着时间推移版本不断更新维护目前最新的是Spring5 Spring1.0是纯配置文件开发Spring2.0为了简化开发引入了注解开发此时是配置文件加注解的开发方式Spring3.0已经可以进行纯注解开发使开发效率大幅提升Spring4.0根据JDK的版本升级对个别API进行了调整Spring5.0已经全面支持JDK8 Spring Framework系统架构 Spring Framework 是 Spring 生态圈中最基础的项目是其他项目的根基 Spring Framework的发展也经历了很多版本的变更每个版本都有相应的调整 Spring Framework的5版本目前没有最新的架构图而最新的是4版本所以接下来主要研究的 是4的架构图 核心层 Core Container核心容器这个模块是 Spring 最核心的模块其他的都需要依赖该模块 AOP层 AOP面向切面编程它依赖核心层容器目的是在不改变原有代码的前提下对其进行功能增强AspectAOP思想Aspects 是对 AOP 思想的具体实现 数据层 Data Access数据访问Spring 全家桶中有对数据访问的具体实现技术Data Integration数据集成Spring 支持整合其他数据层解决方案比如MyBatisTransactions事务Spring 中事务管理是 Spring AOP 的一个具体实现 Web层 Spring MVC 框架 Test层 Spring 主要整合了 Junit 来完成单元测试和集成测试 spring 核心概念 IOC、IOC容器、Bean、DI 在这个代码中由于业务层代码中需要数据层的对象导致两层之间的耦合度很高针对这个问题 Spring 提出了一个解决方案使用对象时在程序中不要主动使用 new 产生对象转换为由外部提供对象 IOCInversion of Control控制反转控制反转的是对象的创建权 使用对象时由主动new产生对象转换为由外部提供对象此过程中对象创建的控制权由程序转移到外部此思想称为控制反转Spring技术对IOC思想进行了实现提供了一个容器称为IOC容器用来充当IOC思想的 “ 外部 ”IOC容器负责对象的创建、初始化等一系列工作被创建或被管理的对象在IOC容器中统称为 Bean对象 DIDependency Injection依赖注入绑定对象与对象之间的依赖关系 但是现在又有一个问题当 IOC 容器中创建好 service 和 dao 对象后因为 service 运行需要依赖 dao 对象但是 service 对象和 dao 对象没有任何关系导致程序无法正确运行而在容器中建立对象与对象之间的绑定关系就要用到 DI 在容器中建立 bean 与 bean 之间的依赖关系的整个过程称为依赖注入 介绍完 Spring 的 IOC 和 DI 的概念后我们会发现这两个概念的最终目标就是:充分解耦具体实现靠: 使用 IOC 容器管理 beanIOC)在 IOC 容器内将有依赖关系的 bean 进行关系绑定DI最终结果为使用对象时不仅可以直接从 IOC 容器中获取并且获取到的 bean 已经绑定了所有的依赖关系. IOC容器Spring 创建了一个容器用来存放所创建的对象这个容器就叫 IOC 容器Bean容器中所存放的一个个对象就叫 Bean 或 Bean 对象 IOC快速入门 创建 Maven 项目 pom.xml引入依赖 dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.10.RELEASE/version /dependencyresources下创建 spring 配置文件applicationContext.xml然后配置 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--bean标签标示配置beanid属性标示给bean起名字class属性表示给bean定义类型--bean idbookDao class项目下的Dao实现类路径/bean idbookService class项目下的Service实现类路径//beans注意事项 bean 定义时 id 属性在同一个配置文件中不能重复 使用 Spring 提供的接口完成 IOC 容器的创建 从容器中获取对象进行方法调用 public class App {public static void main(String[] args) {//获取IOC容器ApplicationContext ctx newClassPathXmlApplicationContext(applicationContext.xml);//这里的这个xml就是刚才创建的Spring的配置文件BookDao bookDao (BookDao) ctx.getBean(bookDao);//通过容器来获取Bean对象bookDao.save();} } DI快速入门 实现依赖注入必须要基于 IOC 管理 Bean 去除代码中的 new 为属性提供 setter 方法 public class BookServiceImpl implements BookService {//删除业务层中使用new的方式创建的dao对象//private BookDao bookDao new BookDaoImpl();private BookDao bookDao;public void save() {System.out.println(book service save ...);bookDao.save();}//提供对应的set方法public void setBookDao(BookDao bookDao) {this.bookDao bookDao; } }在配置文件中添加依赖注入的配置 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--bean标签标示配置beanid属性表示给bean起名字class属性表示给bean定义类型--bean idbookDao classcom.XXX.dao.impl.BookDaoImpl/bean idbookService classcom.XXX.service.impl.BookServiceImpl!--配置server与dao的关系--!--property标签表示配置当前bean的属性name属性表示配置哪一个具体的属性ref属性表示参照哪一个bean--property namebookDao refbookDao//bean /beans注意: 配置中的两个 bookDao 的含义是不一样的 namebookDao中bookDao的作用是让Spring的IOC容器在获取到名称后将首字母大写前 面加set找对应的setBookDao()方法进行对象注入refbookDao中 bookDao 的作用是让 Spring 能在IOC容器中找到id为bookDao的Bean对象给 bookService 进行注入 IOC IOC 中对象的相关配置以及实例化方式和生命周期 Bean基础配置 id与class属性 注意 因为 bookDao 和 bookService 一般在项目中是接口接口不能实现所以一般是使用它的实现类来进行对象的创建 name属性 XML中的配置写法 !--name属性:为bean指定别名别名可以有多个使用逗号分号空格进行分隔-- !-- Ebi全称Enterprise Business Interface翻译为企业业务接口 -- bean idbookService nameservice service4 bookEbiclassBookServiceImpl的类路径property namebookDao refbookDao//beanbean idbookDao namedao classBookDaoImpl的类路径/ 注意 通过 ref 属性来指定 bean 被指定的 bean 必须在容器中存在而且 ref 属性值可以是 bean 的 name 属性值获取bean无论是通过id还是name获取如果无法获取到将抛出异常 NoSuchBeanDefinitionException scope属性 注意 bean 为单例的意思是在 Spring 的 IOC 容器中只会有该类的一个对象避免了对象的频繁创建与销毁达到了 bean 对象的复用性能高bean在容器中 如果对象是有状态对象即该对象有成员变量可以用来存储数据的因为所有请求线程共用一个bean对象所以会存在线程安全问题。如果对象是无状态对象即该对象没有成员变量没有进行数据存储的因方法中的局部变量在方法调用完成后会被销毁所以不会存在线程安全问题。 表现层对象、业务层对象、数据层对象、工具对象适合交给容器进行管理封装实例的域对象因为会引发线程安全问题所以不适合交给容器进行管理 Bean的实例化 bean本质上就是对象对象在new的时候会使用构造方法完成那创建bean也是使用构造方法完成的基于此Bean 有三种创建方式 构造方法 Spring底层使用的是类的无参构造方法而且是通过反射来访问到类中的方法的 静态工厂 这种方式一般是用来兼容早期的一些老系统需要在Spring的配置文件中加入以下内容 bean idorderDao classOrderDaoFactory类路径名 factory-methodgetOrderDao/ !-- class:工厂类的类全名 -- !-- factory-mehod:具体工厂类中创建对象的方法名 -- 虽然在工厂类中也是直接new对象但是在工厂的静态方法中我们除了new 对象外还可以做一些必不可少的业务操作 实例工厂 在Spring的配置文件中加入以下内容 bean iduserFactory classUserDaoFactory的类路径/ bean iduserDao factory-methodgetUserDao factory-beanuserFactory/实例化工厂运行的顺序是 创建实例化的工厂对象,对应的是第一行配置调用对象中的方法来创建bean对象对应的是第二行配置 factory-bean:工厂对象factory-method:工厂对象中具体创建 bean 对象的方法名,对应关系如下: FactoryBean的使用工厂实例的简化 这种方式在Spring去整合其他框架的时候会被用到 让工厂类这里以UserDaoFactory为例实现FactoryBean接口重写接口的方法 方法一 getObject()被重写后在方法中进行对象的创建并返回方法二 getObjectType()被重写后主要返回的是被创建类的Class对象方法三 没有被重写因为它已经给了默认值 true单例false为非单例作用是设置对象是否为单例 在Spring的配置文件中进行配置 bean iduserDao classUserDaoFactoryBean类路径/Bean的生命周期 bean 的生命周期bean 对象从创建到消亡的完整过程 bean 生命周期控制的是 bean 对象从创建后到销毁前做一些事情 关于 Spring 中对 bean 生命周期控制提供了两种方式 在配置文件中的 bean 标签中添加 init-method属性和destory-method属性类实现InitializingBean接口和DisposableBean接口 添加初始化和销毁方法 bean idbookDao classcom.XXX.dao.impl.BookDaoImpl init-methodinit destroy-methoddestory/init-method 属性是初始化方法而 destroy-method 属性是销毁的方法 但是执行后只会执行初始化的 init 方法而未执行销毁方法destory为什么 原因是 Spring 的 IOC 容器是运行在 JVM 中运行 main 方法后JVM 启动Spring 加载配置文件生成 IOC 容器从容器获取 bean 对象然后调方法执行main 方法执行完后JVM 退出这个时候 IOC 容器中的 bean 还未来得及销毁就已经结束了所以没有调用对应的 destory 方法 close关闭容器 ApplicationContext 中没有 close 方法所以需要将 ApplicationContext 更换为 ClassPathXmlApplicationContextClassPathXmlApplicationContext 是 ApplicationContext 的子类 来调用 close 方法这样就可以正常的执行容器的销毁了 注册钩子关闭容器 在容器未关闭之前提前设置好回调函数让 JVM 在退出之前回调此函数来关闭容器调用 registerShutdownHook 方法 注意 RegisterShutdownHook 方法在 ApplicationContext 中也没有所以依然要使用 ClassPathXmlApplicationContext 关闭方式的区别 close 方法和 RegisterShutdownHook 方法区别 相同点两种方法都能用来关闭容器不同点close 方法是在执行调用的时候关闭registerShutdownHook 方法是在 JVM 退出前自动调用关闭 通过接口来简化关闭容器 在实现类中实现 InitializingBean 和 DisposableBean 两个接口之后重写 afterPropertiesSet 方法和 destory 方法 注意 InitializingBean 接口中的 afterPropertiesSet 方法翻译过来为 属性设置之后对于 servce 层中的实现类方法来说Dao 层的实现类为它的一个属性setxxxDao 方法是 Spring 的 IOC 容器为它注入属性的方法而setxxxDao方法先执行afterPropertiesSet 方法后执行 总结 对于 bean 的生命周期控制在 bean 的整个生命周期中所处的位置 初始化容器 1.创建对象内存分配2.执行构造方法3.执行属性注入set操作4.执行 bean 初始化方法 使用 bean 执行业务操作 关闭/销毁容器 执行 bean 销毁方法 DI Spring 中提供了两种注入方式 setter 注入 简单类型基础数据类型和字符串引用类型 构造器注入 简单类型基础数据类型和字符串引用类型 setter注入 在 bean 中定义引用类型属性并提供可访问的 set 方法 public class BookServiceImpl implements BookService {private BookDao bookDao;public void setBookDao(BookDao bookDao) {this.bookDao bookDao;} }配置中使用 property 标签 ref 属性注入引用类型对象 bean idbookService classBookServiceImpl类路径property name实现类中的bookDao的属性 refbean中的bookDao对象/ /beanbean idbookDao classBookDaoImpl类路径/注入引用数据类型 在实现类中声明属性并提供 setter 方法 public class BookServiceImpl implements BookService{private BookDao bookDao;private UserDao userDao;//声明属性public void setUserDao(UserDao userDao) {//提供setter方法this.userDao userDao;}public void setBookDao(BookDao bookDao) {this.bookDao bookDao;}}配置文件中进行注入配置 bean idbookDao classBookDaoImpl类路径/ bean iduserDao classUserDaoImpl类路径/bean idbookService classBookServiceImpl类路径property name实现类中的bookDao属性 refbean中的bookDao对象/property name实现类中的userDao属性 refbean中的userDao对象/ /bean注入简单数据类型 在实现类中声明对应的简单数据类型的属性并提供对应的 setter 方法 public class BookDaoImpl implements BookDao {private String databaseName;//声明属性private int connectionNum;//声明属性// 提供 setter 方法public void setConnectionNum(int connectionNum) {this.connectionNum connectionNum;}public void setDatabaseName(String databaseName) {this.databaseName databaseName;}}在配置问文件中进行注入配置 bean idbookDao classcom.XXX.dao.impl.BookDaoImplproperty name实现类方法中的参数databaseName形参 value形参中的数据值/property name实现类方法中的参数connectionNum形参 value形参中的数据值/ /beanbean iduserDao classcom.XXX.dao.impl.UserDaoImpl/bean idbookService classBookServiceImpl类路径property name实现类中的bookDao属性 refbean中的bookDao对象/property name实现类中的userDao属性 refbean中的userDao对象/ /bean构造器注入 构造器注入也就是构造方法注入无非是把实现类中的 setter 方法改为构造器方法 删除实现类中的 setter 方法并提供构造方法 public class BookServiceImpl implements BookService{private BookDao bookDao;// 在构造方法中对属性进行设置public BookServiceImpl(BookDao bookDao) {this.bookDao bookDao;}}在配置文件中配置构造方法注入 bean idbookDao classBookDaoImpl类路径/bean idbookService classBookServiceImpl类路径constructor-arg name实现类中构造方法的参数bookDao形参 refbean中的bookDao对象/!-- 这里的constructor-arg标签就是通过构造方法注入的标签 -- /bean注意 name 属性对应的值为构造函数中方法形参的参数名必须保持一致ref 属性指向的是 spring 的 IOC 容器中其他的 bean 对象 构造器注入多个数据类型 提供多个属性的构造函数 public class BookServiceImpl implements BookService{private BookDao bookDao;// 声明引用类型属性private UserDao userDao;// 声明引用类型属性// 构造方法注入public BookServiceImpl(BookDao bookDao,UserDao userDao) {this.bookDao bookDao;this.userDao userDao;} }配置文件中配置 bean idbookDao classBookDaoImpl类路径/ bean iduserDao classUserDaoImpl类路径/bean idbookService classBookServiceImpl类路径constructor-arg name实现类中构造方法的参数bookDao refbean中的bookDao对象/constructor-arg name实现类中构造方法的参数userDao refbean中的userDao对象/ /bean注意 constructor-arg 标签的顺序可以任意 构造器注入多个简单数据类型 添加多个简单属性并提供构造方法 public class BookDaoImpl implements BookDao {private String databaseName; //声明简单类型属性private int connectionNum; //声明简单类型属性// 通过构造器注入public BookDaoImpl(String databaseName, int connectionNum) {this.databaseName databaseName;this.connectionNum connectionNum;} }配置文件中配置 bean idbookDao classBookDaoImpl类路径constructor-arg name实现类中构造方法的参数databaseName value参数的值/constructor-arg name实现类中构造方法的参数connectionNum value参数的值/ /beanbean iduserDao classUserDaoImpl类路径/bean idbookService classBookServiceImpl类路径constructor-arg name实现类中构造方法的参数bookDao refbean中的bookDao对象/constructor-arg name实现类中构造方法的参数userDao refbean中的userDao对象/ /bean 解决构造函数中参数名紧耦合 当构造函数中方法的参数名发生变化后配置文件中的name属性也需要跟着变 两块存在紧耦合 解决方法 方式一删除 name 属性添加 type 属性按照类型注入 bean idbookDao classBookDaoImpl类路径constructor-arg typeint value10/constructor-arg typejava.lang.String valuemysql/ /bean这种方式可以解决构造函数形参名发生变化带来的耦合问题但是如果构造方法参数中有类型相同的参数这种方式就不太好实现了 方式二删除 type 属性添加 index 属性按照索引下标注入下标从0开始 bean idbookDao classBookDaoImpl类路径constructor-arg index1 value100/constructor-arg index0 valuemysql/ /bean这种方式可以解决参数类型重复问题但是如果构造方法参数顺序发生变化后这种方式又带来了耦合问题 介绍完这两种参数的注入方式具体我们该如果选择? 强制依赖使用构造器进行使用setter注入有概率不进行注入导致 null 对象出现 强制依赖指对象在创建的过程中必须要注入指定的参数 可选依赖使用 setter 注入进行灵活性强 可选依赖指对象在创建过程中注入的参数可有可无 Spring 框架倡导使用构造器第三方框架内部大多数采用构造器注入的形式进行数据初始化相对严谨如果有必要可以两者同时使用使用构造器注入完成强制依赖的注入使用 setter 注入完成可选依赖的注入实际开发过程中还要根据实际情况分析如果受控对象没有提供 setter 方法就必须使用构造器注入自己开发的模块推荐使用 setter 注入 自动装配 相对于之前的手动配置比较麻烦Spring 提供了自动装配的方式 什么是依赖自动装配 IOC 容器根据 bean 所依赖的资源在容器中自动查找并注入到 bean 中的过程称为自动装配 自动装配的方式有哪些 按类型常用按名称按构造方法不启用自动装配 按照类型完成自动装配的配置 自动装配只需要修改 xml 配置文件即可 在 bean 标签中移除 property 标签在 bean 标签中添加 autowire 属性 按照类型注入的配置 bean classBookDaoImpl类路径/ !--autowire属性开启自动装配通常使用按类型装配-- bean idbookService classBookServiceImpl类路径 autowirebyType/注意 需要注入的属性的类中对应属性的 setter 方法不能省略被注入的对象必须要被 Spring 的 IOC 容器管理按照类型在 Spring 的 IOC 容器中如果找到多个对象会报NoUniqueBeanDefinitionExcepetion 按照名称完成自动注入装配的配置 如果一个类型在 IOC 中有多个对象还想要注入成功这个时候就需要按照名称注入配置方式 bean classBookDaoImpl类路径/ !--autowire属性开启自动装配通常使用按类型装配-- bean idbookService classBookServiceImpl类路径 autowirebyName/注意 按照名称注入中的名称是指对象实现类中的 set 方法的名称去掉 set 后剩下的部分的首字母小写的名称 以上图为例因为 bookDao 是 private 修饰的外部类无法直接访问而外部类访问只能通过属性的 set 方法进行访问 而 set 方法生成的默认规则是set 方法把属性名的首字母大写前面加上 set 形成方法名所以按照名称注入其实是和对应的 set 方法有关但是如果按照标准起名称属性名和 set 对应的名是一致的 如果按照名称去找对应的 bean 对象找不到则注入 Null 当某一个类型在 IOC 容器中有多个对象按照名称注入只找其指定名称对应的 bean 对象不会报错 注意事项配置特征 自动装配用于引用类型依赖注入不能对简单类型进行操作使用按类型装配时byType必须保障容器中相同类型的 bean 唯一使用按名称装配时byName必须保障容器中具有指定名称的bean因变量名与配置耦合自动装配优先级低于 setter 注入与构造器注入同时出现时自动装配配置失效 集合注入 数据还有一种类型是集合而 Spring 当然也支持集合的注入 Spring 中支持的集合类型 Array !-- 注入数组类型数据 -- property namearrayarrayvalue100/valuevalue200/valuevalue300/value/array /propertyList !-- 注入List类型数据 -- property namelistlistvaluecaixunkun/valuevaluexiaoheizi/valuevalueikun/valuevaluerap/value/list /propertySet !-- 注入Set类型数据 -- property namesetsetvaluecaixunkun/valuevaluexiaoheizi/valuevalueikun/valuevaluerap/value/set /propertyMap !-- 注入Map类型数据 -- property namemapmapentry keycountry valuechina/entry keyprovince valuehenan/entry keycity valuekaifeng//map /propertyProperties !-- 注入Properties类型数据 -- property namepropertiespropsprop keycountrychina/propprop keyprovincehenan/propprop keycitykaifeng/prop/props /property注意 property 标签是 bean 标签下的子标签property 标签表示 setter 方式注入构造方法注入 construstor-arg 标签内部也可以写array、list、set、map 标签List 底层也是通过数组实现的所以 list 和 array 标签是可以混用的集合中要添加引用类型只需要把 value 标签改成 ref 标签这种方式用的比较少 加载 properties 文件 对于有些数据写在配置文件中不利于后期维护那么需要将这些值提取到一个外部的 properties 文件中然后让 Spring 框架从外部 properties 文件中读取属性值 准备 properties 配置文件 resource 下创建一个 xxx.properties 文件并添加对应的属性键值对比如 jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://127.0.0.1:3306/spring_db jdbc.usernameroot jdbc.passwordroot开启 context 命名空间 在 applicationContext.xml也就是 bean 对象定义的配置文件中开启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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd /beans加载 properties 配置文件 context:property-placeholder locationjdbc.properties/在配置文件中使用context命名空间下的标签来加载 properties 配置文件 完成属性注入 使用 ${key} 来读取 properties 配置文件中的内容并完成属性注入 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance!-- 开启context空间 --xmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd !-- 开启context空间 --http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd!-- 加载配置文件 --context:property-placeholder locationjdbc.properties/!-- 属性注入 --bean iddataSource classcom.alibaba.druid.pool.DruidDataSourceproperty namedriverClassName value${jdbc.driver}/property nameurl value${jdbc.url}/property nameusername value${jdbc.username}/property namepassword value${jdbc.password}//bean /beans读取单个属性 在实现类中添加对应的属性和属性的设置setter方法 这里实现类用 BookDao 的实现类 BookDaoImpl 完成配置文件的读取与注入 在 applicationContext.xml 添加配置bean的配置管理、读取外部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!-- 读取外部配置文件 --context:property-placeholder locationjdbc.properties/bean idbookDao classBookDaoImpl类路径!-- 属性注入 --property namename value${jdbc.driver}//bean /beans注意事项 问题一properties 配置文件中配置键值对的优先级问题 在配置文件中 key 键为 username 这个使用会有问题假设给其设置的 value 值为 root666而打印出来的则不是 root666 而是自己电脑的用户名 因为 context:property-placeholer 标签会加载系统的环境变量而环境变量的值会优先加载 要解决需要在 context:property-placeholer 标签中加一个 system-properties-mode 属性并给他值设置为 NEVER当然还有就是不使用username作为属性的key context:property-placeholder locationjdbc.properties system-properties-modeNEVER/问题二当有多个 properties 配置文件需要被加载 调整配置文件内容在 resource 下添加多个配置文件 修改 applicationContext.xml ?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!--方式一--context:property-placeholderlocationjdbc.properties,jdbc2.properties system-properties-modeNEVER/!--方式二--context:property-placeholder location*.properties systemproperties-modeNEVER/!--方式三--context:property-placeholder locationclasspath:*.propertiessystem-properties-modeNEVER/!--方式四--context:property-placeholder locationclasspath*:*.propertiessystem-properties-modeNEVER/ /beans注意 方式一如果配置文件多的话需要每个都配置 方式二: *.properties代表所有以properties结尾的文件都会被加载可以解决方式一的问题但是不标准 方式三标准的写法classpath:代表的是从根路径下开始查找但是只能查询当前项目的根路径 方式四不仅可以加载当前项目还可以加载当前项目所依赖的所有项目的根路径下的properties配置文件 核心容器 这里说的核心容器可以简单的理解为ApplicationgContext 容器 容器的创建方法有两种 ApplicationContext ctx new ClassPathXmlApplicationContext(“applicationContext.xml”); 翻译过来为类路径下的 XML 配置文件 ApplicationContext ctx new FileSystemXmlApplicationContext(“D:\workspace\spring\spring_10_container\s rc\main\resources\applicationContext.xml”); 翻译过来为文件系统下的 XML 配置文件该方式是从项目路径下开始查找applicationContext.xml所以要把括号内参数修改为绝对路径也就是从盘符开始写起 Bean 的三种获取方式 方式一 BookDao bookDao (BookDao) ctx.getBean(“bookDao”); 这种方式存在的问题就是获取的时候都需要进行类型转换 方式二 BookDao bookDao ctx.getBean(“bookDao”, BookDao.class); 这种方式可以解决类型强转问题但是参数又多加了一个相对来说没有简化多少 方式三 BookDao bookDao ctx.getBean(BookDao.class); 这种方式就类似依赖注入中的按类型注入必须要确保 IOC 容器中该类型对应的 bean 对象只能有一个。 Bean 标签属性的总结 容器类层次结构 在 IDEA 中双击shift输入 BeanFactory点击进入 BeanFactory 类ctrlh,就能查看到如下结构的层次关系中可以看出容器类也是从无到有根据需要一层层叠加上来的BeanFactory 是 IoC 容器的顶层接口ApplicationContext 接口是 Spring 容器的核心接口接口提供基础的 bean 操作相关方法通过其他接口扩展其功能 BeanFactory的使用 使用BeanFactory来创建IOC容器的具体实现方式为 public class AppForBeanFactory {public static void main(String[] args) {Resource resources new ClassPathResource(applicationContext.xml);BeanFactory bf new XmlBeanFactory(resources);BookDao bookDao bf.getBean(BookDao.class);bookDao.save();} }BeanFactory 和 ApplicationContext 区别 BeanFactory 是延迟加载只有在获取 bean 对象的时候才会去创建ApplicationContext 是立即加载容器加载的时候就会创建 bean 对象 ApplicationContex 要想称为延迟加载只需要如下配置 ?xml version1.0 encodingUTF-8?beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd!-- 在bean标签下使用 lazy-init属性值设置为true --bean idbookDao classBookDaoImpl类路径 lazy-inittrue/ /beans依赖注入相关总结 IOC/DI注解开发 在 Spring 发展到2.0的时候提供了注解开发而且通过配置文件的开发发现太过于繁琐那么接下来是 Spring2.5 的注解开发 注解开发定义bean 步骤 删除原 XML 配置将配置文件中的 bean 标签删除掉 bean idbookDao classBookDaoImpl实现类/Dao 上添加注解 Component(bookDao)public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ... );} }注意 Componet注解不可以添加在接口上因为接口是无法创建对象的XML与注解配置的对应关系 配置 Spring 的注解包扫描 为了让 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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdcontext:component-scan base-packagecom.xxx/ /beans说明 component-scancomponent组件,Spring 将管理的 bean 视作自己的一个组件scan扫描base-package 指定 Spring 框架扫描的包路径它会扫描指定包及其子包中的所有类上的注解。包路径越多[如:com.XXX.dao.impl]扫描的范围越小速度越快包路径越少[如:com.XXX]扫描的范围越大速度越慢一般扫描到项目的组织名称即Maven的groupId下[如:com.XXX]即可。 Service 上添加注解 在 BookServiceImpl 类上也添加Component交给 Spring 框架管理 Component public class BookServiceImpl implements BookService {private BookDao bookDao;public void setBookDao(BookDao bookDao) {this.bookDao bookDao;}public void save() {System.out.println(book service save ...);bookDao.save();} } Component注解如果不起名称会有一个默认值就是当前类名首字母小写所以也可以按照名称获取如 BookService bookService (BookService)ctx.getBean(bookServiceImpl);对于Component注解还衍生出了其他三个注解Controller、Service、Repository 通过查看源码会发现: 这三个注解和Component注解的作用是一样的方便后期在编写类的时候能很好的区分出这个类是属于表现层、业务层还是数据层的类。 名称Component/Controller/Service/Repository类型类注解位置类定义上方作用设置该类为 spring 管理的 bean属性value默认定义 bean 的id 纯注解开发模式 上面虽然是通过注解简化了一些操作但是还是有配置文件显得繁琐Spring3.0 提供了纯注解开发使用 Java 类替代配置文件开启了 Spring 快速开发 创建配置类 标识该类为配置类 Configuration //配置类注解标识了该类为配置类用来替代applicationContext.xml public class SpringConfig {//配置类 }用注解替换包扫描配置 //在配置类上添加包扫描注解ComponentScan替换application.xml文件中的context:component-scan base-package/ Configuration ComponentScan(com.XXX) public class SpringConfig { } // application.xml文件就可以退休了至此纯注解开发方式已完成主要包括 Java 类替换 Spring 核心配置文件 Configuration 注解用于设定当前类为配置类 ComponentScan注解用于设定扫描路径此注解只能添加一次多个数据用数组格式 ComponentScan({com.XXX.service,com.XXX.dao})读取 Spring 核心配置文件初始化容器对象切换为读取 Java 配置类初始化容器对象 //加载配置文件初始化容器 ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml); //加载配置类初始化容器 ApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class); 名称Configuration类型类注释位置类定义上方作用设置该类为 Spring 配置类位置value默认值定义 bean 的id 名称ComponentScan类型类注解位置类定义上方作用设置 Spring 配置类扫描路径用于加载使用注解格式定义的 bean位置value默认值扫描路径此路径可以逐层向下扫描 applicationContext.xml 中context:component-san/的作用是指定扫描包路径注解为ComponentScan Configuration标识该类为配置类使用类替换applicationContext.xml文件 ClassPathXmlApplicationContext 是加载XML配置文件 AnnotationConfigApplicationContext 是加载配置类 注解开发bean作用范围与生命周期管理 作用范围主要是指是否是单例模式而生命周期则是指初始化和销毁的方法定义 bean的作用范围 使用Scope注解 Repository //Scope设置bean的作用范围 Scope(prototype) public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ...);} }名称Scope类型类注解位置类定义上方作用设置该类创建对象的作用范围可用于设置创建出的 bean 是否是单例对象属性value定义 bean 作用范围默认值 singleton单例可选填 prototype非单例 bean的生命周期 在 BookDaoImpl 中添加两个方法init和destroy,方法名可以任意 在对应的方法上添加PostConstruct和PreDestroy 注解即可 Repository public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ...);}PostConstruct //在构造方法之后执行替换 init-methodpublic void init() {System.out.println(init ...);}PreDestroy //在销毁方法之前执行,替换 destroy-methodpublic void destroy() {System.out.println(destroy ...);} }注意 PostConstruct和PreDestory注解如果找不到需要导入以下 Jar 包 dependencygroupIdjavax.annotation/groupIdartifactIdjavax.annotation-api/artifactIdversion1.3.2/version /dependency因为从 JDK9之后 jdk 中的 javax.annotation 包被移除了这两个注解刚好就在这个包中 名称PostConstruct类型方法注解位置方法上作用设置该方法为初始化方法属性无 名称PreDestroy类型方法注解位置方法上作用设置该方法为销毁方法属性无 注解开发依赖注入 Spring 为了使用注解简化开发并没有提供构造函器注入、setter注入对应的注解只提供了自动装配的注解实现。 注解实现按照类型注入 在 BookServiceImpl 类的 bookDao 属性上添加Autowired注解 Service public class BookServiceImpl implements BookService {Autowiredprivate BookDao bookDao;// public void setBookDao(BookDao bookDao) {// this.bookDao bookDao;// }public void save() {System.out.println(book service save ...);bookDao.save();} }注意 Autowired可以写在属性上也可以写在 setter 方法上最简单的处理方式是写在属性上并将setter方法注释掉自动装配是基于反射创建对象并通过暴力反射为私有属性进行设值普通反射只能获取 public 修饰的内容暴力反射除了获取 public 修饰的内容还可以获取 private 修饰的内容所以无需提供 setter 方法Autowired是按照类型注入那么对应 BookDao 接口如果有多个实现类或导致报错那么就需要使用按照名称注入 名称Autowired类型属性注解或方法注解或方法形参注解位置属性定义上方或标准 set 方法上方或类 set 方法上方或方法形参前面作用为引用类型属性设置值属性requiredtrue/false定义该属性是否允许为null 注解实现按照名称注入 当根据类型在容器中找到多个 bean注入参数的属性名又和容器中bean的名称不一致这个时候就需要使用到Qualifier来指定注入哪个名称的bean对象。 Service public class BookServiceImpl implements BookService {AutowiredQualifier(bookDao1)private BookDao bookDao;public void save() {System.out.println(book service save ...);bookDao.save();} }注意 Qualifier注解后的值就是需要注入的bean的名称Qualifier不能单独使用必须和Autowired一起使用 名称Qualifier类型属性注解或方法注解位置属性定义上方或标准 set 方法上方或类 set 方法上方或作用为引用类型属性指定注入的 beanId属性value设置注入的 beanId 简单数据类型注入 简单类型注入的是基本数据类型或者字符串类型 假设在 BookDaoImpl 类中添加一个 name 属性用其进行简单类型注入 Repository(bookDao) public class BookDaoImpl implements BookDao {private String name;public void save() {System.out.println(book dao save ... name);} }数据类型换了对应的注解也要跟着换这次使用Value注解将值写入注解的参数中就行了 Repository(bookDao) public class BookDaoImpl implements BookDao {Value(XXXX)private String name;public void save() {System.out.println(book dao save ... name);} }注意 数据格式要匹配如将 “abc” 注入给 int 值这样程序就会报错。 名称Value类型属性注解或方法注解位置属性定义上方或标准 set 方法上方或类 set 方法上方或作用为基本数据类型或字符串类型属性设置值属性value要注入的属性值 注解读取 properties 配置文件 Value一般会被用在从 properties 配置文件中读取内容进行使用 接下来进行演示 准备 properties 文件 //jdbc.properties nameXXXX888加载 properties 文件 Configuration ComponentScan(com.XXX) PropertySource(jdbc.properties) public class SpringConfig { }使用value读取配置文件中的内容 Repository(bookDao) public class BookDaoImpl implements BookDao {Value(${name})private String name;public void save() {System.out.println(book dao save ... name);} }注意 如果读取的 properties 配置文件有多个可以使用PropertySource的属性来指定多个 PropertySource({jdbc.properties,xxx.properties})PropertySource注解属性中不支持使用通配符*运行会报错的 PropertySource({*.properties})PropertySourcez注解属性中可以把classpath:加上代表从当前项目的根路径找文件,而且也不可以加上* PropertySource({classpath:jdbc.properties})名称PropertySource类型类注解位置类定义上方作用加载 properties 文件中的属性值属性value设置加载的 properties 文件对应的文件名或文件名组成的数组 IOC/DI注解开发管理第三方bean 对于第三方在 jar 包中的类需要使用Bean注解 注解开发管理第三方bean 以对Druid数据源的管理为例 导入 Druid 对应的 jar 包 dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.16/version /dependency 在配置类中添加一个方法 Configuration public class SpringConfig {public DataSource dataSource(){//该方法的返回值就是要创建的Bean对象类型DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;} }在方法上添加Bean注解 Configuration public class SpringConfig {Bean//Bean注解的作用是将方法的返回值制作为Spring管理的一个bean对象public DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;} }注意 不能使用DataSource ds new DruidDataSource()接口来实例化因为 DataSource 接口中没有对应的 setter 方法来设置属性。 名称Bean类型方法注解位置方法定义上方作用设置该方法的返回值作为 Spring 管理的 bean属性value定义 bean 的 id 引入外部配置类 如果把所有的第三方 bean 都配置到 Spring 的配置类 SpringConfig 中虽然可以但是不利于代码阅读和分类管理可以按照类别将这些 bean 配置到不同的配置类中 比如 public class JdbcConfig {Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;} }这个配置类如何能被 Spring 配置类加载到并创建 DataSource 对象在 IOC 容器中 使用包扫描引入 在 Spring 配置类上添加包扫描 Configuration ComponentScan(com.XXX.config) public class SpringConfig { }在 JdbcConfig 上添加配置注解 Configuration public class JdbcConfig {Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;} }这种方式虽然能够扫描到但是不能很快的知晓都引入了哪些配置类 使用Import注解引入 去除 JdbcConfig 类上的注解 public class JdbcConfig {Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;} } 在 Spring 配置类中引入 Configuration //ComponentScan(com.XXX.config) Import({JdbcConfig.class}) public class SpringConfig { }注意 Import参数需要的是一个数组可以引入多个配置类。 Import注解在配置类中只能写一次下面的方式是不允许的 Configuration //ComponentScan(com.XXX.config) Import(JdbcConfig.class) Import(Xxx.class) public class SpringConfig { } 名称Import类型类注解位置类定义上方作用导入配置类属性value定义导入的配置类类名当配置类有多个时使用数组格式一次性导入多个配置类 注解开发实现为第三方bean注入资源 在使用Bean创建bean对象的时候如果方法在创建的过程中需要其他资源这些资源会有两大类分别是简单数据类型和引用数据类型 以下面 Durid 的管理为例 public class JdbcConfig {Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;} }简单数据库类型 类中提供四个属性 使用Value注解引用 public class JdbcConfig {Value(com.mysql.jdbc.Driver)private String driver;Value(jdbc:mysql://localhost:3306/spring_db)private String url;Value(root)private String userName;Value(password)private String password;Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;} }但是一般数据库连接的四要素是写在 properties 配置文件中的 resources目录下添加 jdbc.properties配置文件中提供四个键值对分别是数据库的四要素使用PropertySource加载 jdbc.properties 配置文件修改Value注解属性的值将其修改为 ${key}key 就是键值对中的键的值 引用数据类型 假设在构建 DataSource 对象的时候需要用到 BookDao 对象该如何把 BookDao 对象注入进方法内 在 SpringConfig 中扫描 BookDao //扫描的目的是让Spring能管理到BookDao,也就是说要让IOC容器中有一个bookDao对象 Configuration ComponentScan(com.XXX.dao) Import({JdbcConfig.class}) public class SpringConfig { }在 JdbcConfig 类的方法上添加参数 Bean public DataSource dataSource(BookDao bookDao){//直接将需要的类对象作为参数写在方法的参数位置System.out.println(bookDao);DruidDataSource ds new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds; } //引用类型注入只需要为bean定义方法设置形参即可容器会根据类型自动装配对象。XML开发和注解的对比
http://www.pierceye.com/news/510198/

相关文章:

  • 广州网站建设 骏域网站建设做搜狗网站优化首页软
  • 广州网站设计软件简约大方网站
  • 网站建设与管理专业好吗做国际贸易如何建网站
  • 小说百度风云榜上海seo网络推广渠道
  • 建设局网站打不开是什么原因wordpress客户端插件
  • 农业 网站源码网站制作产品优化
  • 企业公司网站制作建设怎么区分营销型网站
  • 如何选择顺德网站建设网站开发源代码
  • 北京城乡建设部网站网站页面是自己做还是使用模板
  • 网新企业网站管理系统厦门好景科技做网站
  • 手机网站开发语言深圳网站建设培训
  • wordpress做的视听网站怎么用ftp清空网站
  • 网站建设能干什么网页设计代码模板人物介绍
  • 桂阳网站设计做p2p投资理财的网站
  • 做学术论文的网站从化专业做网站
  • 从化网站制作狮山公司网站建设
  • 网站开发验证码图片不显示php 自动做网站点击量
  • 大连网站开发费多少钱合肥企业网站建设工作室
  • 小企业网站建设的基础知识wap网站 开发
  • 地方门户网站赚钱吗沈阳黑酷做网站建设优化公司怎么样
  • 佛山市seo网站设计工具内部网站建设软件下载
  • 深圳网站建设高端设计网站建设 补充协议
  • 枣阳网站建设 枣阳山水数码自己建网站备案
  • 网站网站制作多少钱共享看世界新域名
  • 网站空间 阿里云wordpress多站点403
  • 下载网站备案的核验单免费ppt模板下载红色
  • discuz 网站备案信息代码温州网站建设优化公司
  • 外国人做汉字网站微网站开发手机模拟器
  • dede做网站网站群 优点
  • 网站制作多久能完成客户管理软件公司