网站怎么做json数据库,做网站优化步骤,长春网络优化哪个公司在做,安装wordpress前出现500 错误介绍Spring为什么要学Spring技术是JavaEE开发必备技能企业开发技术选型命中率90%简化开发#xff0c;降低企业级开发的复杂性高效整合其他技术#xff0c;提高企业级应用开发与运行效率框架整合学什么spinrg最重要的作用就是简化来发和框架整合, 我们的学习也从这些开始简…介绍Spring为什么要学Spring技术是JavaEE开发必备技能企业开发技术选型命中率90%简化开发降低企业级开发的复杂性高效整合其他技术提高企业级应用开发与运行效率框架整合学什么spinrg最重要的作用就是简化来发和框架整合, 我们的学习也从这些开始简化开发IoCAOP事务处理框架整合MyBatisMyBatis-plusStrutsStruts2Hibernate怎么学学习Spring框架设计思想学习基础操作思考操作与思想间的联系学习案例熟练应用操作的同时体会思想什么是springspring官网详细介绍了spring官网: spring.ioSpring发展到今天已经形成了一种开发的生态圈Spring提供了若干个项目每个项目用于完成特定的功能Spring Framework: spring所有的技术都依赖Spring FrameworkSpring Boot: 简化Spring Framework的开发配置Spring cloud: 微服务解决方案学完以上技术可以应对市场上绝大部分的开发工作发展历程Rod Johnson 被称为 spring之父Spring1.0 基于纯配置的开发方案Spring2.0 引入注解功能简化开发Spring3.0 可以不写配置, 使用纯注解的方式进行开发Spring4.0 紧跟JDK的升级, 调整了个别APISpring5.0 全面支持JDK8Spring Framework系统架构图Spring Framework是Spring生态圈中最基础的项目是其他项目的根基,Spring4的架构已经趋于稳定, Spring5沿用Spring4的架构Spring Framework系统结构数据访问层Data Access: 数据访问Data Integration:数据集成JDBC 抽象层通过JdbcTemplate消除重复的样板代码ORM 集成 Hibernate、MyBatis、JPA 等 ORM 框架提供统一操作接口OXM 支持对象与 XML 的映射如 JAXB、XStreamTransactions 提供声明式事务Transactional注解和编程式事务管理适配 JDBC/JTA 等场景Web开发Serviet: 基于 Servlet 的 Web 开发支持 (处理HTTP请求)WebSocket: 支持 WebSocket 协议实现客户端与服务器的双向实时通信。Web 应用的基础功能请求处理、文件上传等AOPAspectsAOP: 面向切面编程Aspects: AOP思想实现实现横切逻辑与业务逻辑的解耦如日志、事务、安全Core container (核心容器 )Beans: 定义 Bean 的创建、配置、管理规则, 是 IoC 容器操作的基础Core: IoC 容器的核心实现管理 Bean 的生命周期和依赖关系Context: 核心上下文, 提供国际化、事件传播、资源加载、企业级服务邮件 / 调度等功能SpEL: Spring表达式语言, 支持动态访问对象属性、调用方法、执行运算Test (集成单元测试与集成测试)支持 Spring 组件的测试集成 JUnit/TestNG提供 Mock 对象、测试上下文等能力。Spring Framework学习线路核心概念对比传统开发与Spring开发传统开发代码中使用的对象, 都是程序员通过new的方式创建出来呢的存在的问题: 对象与程序高度耦合, 一旦对象需要变动, 程序就要大范围改动Spring开发使用对象时, 不再使用new产生对象由Spring提供对象控制反转(IoC): 把对象的控制权由程序员转移给Spring容器, 这种思想称为控制反转在Spring中, IoC容器负责对象的创建、初始化等一系列工作被创建或被管理的对象在IoC容器中统称为Bean依赖注入(DI): 开发中ben与ben之间可能存在依赖关系, Spring在创建bean的时候, 要绑定bean之间的依赖关系称为依赖注入概念小结Spring的核心作用让对象与程序充分解耦使用IoC容器管理bean, 这个过程称为控制反转在IoC容器内将有依赖关系的bean进行关系绑定, 称为依赖注入得益于Spring的控制反转和依赖注入技术, 程序员在使用对象时可以直接从IoC容器中获取并且获取到的bean已经绑定了所有的依赖关系入门案例IOC入门案例导入 Spring开发的基本包坐标定义Spring管理的类(接口)创建 Spring核心配置文件, 一般是applicationContext.xml, 可以是其他命名在 Spring配置文件中配置需要管理的bean初始化IoC容易, 通过容器获得BeanDI入门案例删除使用new的形式创建对象的代码提供依赖对象对应的setter方法IoC容器通过调用 setBookDao 方法, 完成对象的注入配置service与dao之间的关系property标签表示配置当前bean的属性name属性表示配置哪一个具体的属性ref属性表示参照哪一个bean再次运行程序核心容器Bean的配置bean基础配置用于配置对象交由Spring来创建。默认情况下它调用的是类中的无参构造函数, 如果没有无参构造函数则不能创建成功。// 基本属性 // id: Bean实例在Spring容器中的唯一标识 // class: Bean的全限定名称 bean iduserDao classcom. itheima.dao.impl.UserDaoImpl/beanbean别名配置bean作用范围配置// 当scope的取值为singleton时 // Bean的实例化个数:1个 (创建容器时创建一个对象) // Bean的实例化时机:当Spring核心文件被加载时实例化配置的Bean实例Bean的生命周期: // 对象创建:当应用加载创建容器时对象就被创建了 // 对象运行:只要容器在对象一直活着 // 对象销毁:当应用卸载销毁容器时对象就被销毁了 bean iduserDao classcom. itheima.dao.impl.UserDaoImpl scopesingleton/bean // 当scope的取值为prototype时 // Bean的实例化个数:多个 (每次获取对象, 都创建一个) // Bean的实例化时机:当调用getBean0方法时实例化Bean // 对象创建:当使用对象时创建新的对象实例 // 对象运行:只要对象在使用中就一直活着 // 对象销毁:当对象长时间不用时被Java的垃圾回收器回收了 bean iduserDao classcom. itheima.dao.impl.UserDaoImpl scopeprototype/bean为什么bean默认为单例?如果一个对象用一次就创建一个, 对IoC容器来说, 管理的压力就很大只要类不改变, 类创建的对象就尽可能的复用, 资源利用更合理适合交给容器进行管理的bean表现层对象业务层对象数据层对象工具对象不适合交给容器进行管理的bean封装实体的域对象实例化Bean的四种方式无参构造方法实例化提供可访问的构造方法// 默认的创建ben的方式 // 调用无参构造方法创建对象 // 无参构造方法如果不存在将抛出异常BeancreationException bean idbookDao classcom.itheima.dao.impl.BookDaoImpl/bean工厂静态方法实例化public class StaticFactory { public static UserDao getUserDao() { return new UserDaoImpl(); } }// 调用工厂类的静态方法创建对象 // class指定工厂类 // factory-method指定工厂类中制造对象的方法 bean iduserDao classcom.itheima.factory.StaticFactory factory-methodgetUserDao/bean工厂实例方法实例化public class DynamicFactory { public UserDao getUserDao() { return new UserDaolmpl(); } }// 调用工厂类的实例方法创建对象 // 1.让spring先创建工厂类对象 bean idfactory classcom.itheima.factory.DynamicFactory/bean // 2.再调用工厂类对象的方法创建目标对象 // factory-bean指向工厂bean // factory-method指向工厂bean的方法 bean iduserDao factory-beanfactory factory-methodgetUserDao/FactoryBean (实用)// FactoryBean的定义 public class UserDaoFactoryBean implements FactoryBeanUserDao { // 指定要返回的对象, 该对象会交由IoC容器管理 public UserDao getobject() throws Exception { return new UserDaoImpl(); } // 指定返回对象的类型 public Class? getobjectType() { return UserDao.class; } // 指定对象是否单例 (一般不写) // 返回true单例 // 返回false多例 public boolean isSingleton() { return true; } }// 使用FactoryBean工厂实例化bean // class指向FactoryBean, FactoryBean返回什么对象, Spring就管理什么对象 bean iduserDao classcom.itheima.factory.UserDaoFactoryBean /Bean生命周期配置基本概念生命周期: 从创建到消亡的完整过程bean生命周期: bean从创建到销毁的整体过程bean生命周期控制: 在bean创建后到销毁前做一些事情方式1: 提供生命周期方法import com. itheima. dao.UserDao; public class UserDaoImpl implements UserDao { public void save() { System out.println(save running....) } public UserDaoImpl() { System out.println(UserDaoImpl创建....) } public void init(){ System out.println(初始化方法....) } public void destory() { System out.println(销毁方法....) } }// 配置声明周期方法 // init-method: 指定类中的初始化方法名称 // destroy-method: 指定类中销毁方法名称 bean iduserDao classcom.itheima.dao.impl.UserDaoImpl init-methodinit destroy-methoddestory/bean方式2: 实现InitializingBeanDisposableBean接口特别说明:java程序运行在虚拟机中, 上面的程序执行完后虚拟机就会退出, 根据没有给IoC容器销毁bean的机会, 所以上面的程序中看不到bean销毁的过程容器关闭前触发bean的销毁手工关闭容器:ConfigurableApplicationcontext 接囗 close() 操作注册关闭钩子在虚拟机退出前先关闭容器再退出虚拟机ConfigurableApplicationcontext接registerShutdownHook()操作Bean的完整生命周期初始化容器阶段创建对象(内存分配 )执行构造方法执行属性注入(set操作 )执行bean初始化方法使用bean阶段执行业务操作关闭/销毁容器阶段执行bean销毁方法核心内容小结依赖注入方式思考: 向一个类中传递数据的方式有几种?普通方法(set方法)构造方法思考: 依赖注入描述了在容器中建立bean与bean之间依赖关系的过程, 如果bean运行需要的是数字或字符串呢?引用类型简单类型(基本数据类型与String)依赖注入方式setter注入简单类型引用类型构造器注入简单类型引用类型setter注入--引用类型在bean中定义引用类型属性并提供可访问的set方法配置中使用property标签ref属性注入引用类型对象setter注入--简单类型在bean中定义引用类型属性并提供可访问的set方法配置中使用property标签value属性注入简单类型数据构造器注入---引用类型(了解)在bean中定义引用类型属性并提供可访问的构造方法配置中使用constructor-arg标签ref属性注入引用类型对象构造器注入--简单类型(了解 )在bean中定义引用类型属性并提供可访问的set方法配置中使用constructor-arg标签value属性注入简单类型数据构造器注入--参数适配(了解 )配置中使用constructor-arg标签type属性设置按形参类型注入配置中使用constructor-arg标签index属性设置按形参位置注入依赖注入方式选择强制依赖使用构造器进行使用setter注入有概率不进行注入导致null对象出现可选依赖使用setter注入进行灵活性强Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化相对严谨如果有必要可以两者同时使用使用构造器注入完成强制依赖的注入使用setter注入完成可选依赖的注入实际开发过程中还要根据实际情况分析如果受控对象没有提供setter方法就必须使用构造器注入自己开发的模块推荐使用setter注入依赖自动装配IoC容器根据bean所依赖的资源在容器中自动査找并注入到bean中的过程称为自动装配自动装配方式按类型(常用)按名称按构造方法不启用自动装配配置中使用bean标签autowire属性设置自动装配的类型依赖自动装配特征自动装配用于引用类型依赖注入不能对简单类型进行操作使用按类型装配时(byType)必须保障容器中相同类型的bean唯一推荐使用使用按名称装配时(byName)必须保障容器中具有指定名称的bean因变量名与配置耦合不推荐使用自动装配优先级低于setter注入与构造器注入同时出现时自动装配配置失效集合注入注入数组对象注入List对象(重点)注入Set对象注入Map对象(重点)注入Properties对象小案例: 数据源对象管理导入druid坐标配置数据源对象作为spring管理的bean如果使用默认的库, 坐标怎么找?怎么确定参数?根据名称找对象, 相关的参数会不止一个, 需要自己辨别, 不行就百度吧点进去对象, CtrlF12 (查看所有方法), 排查是否提供了参数注入的构造方法, 如果没有的话就用setter注入确定了参数的注入方式, 具体的参数名还要根据提示找, 一般不难找, 实在不行百度吧上面的小案例中参数写死在了程序中, 更规范的形式是写在配置文件中本节介绍加载properties文件参数的步骤开启context命名空间使用context命名空间加载指定properties文件使用 ${} 读取加载的属性值一些注意的细节不加载系统属性 (存在属性冲突使用, 比如系统存在环境变量username, 一般用不到)加载多个properties文件加载所有properties文件加载properties文件标准格式从类路径或jar包中搜索并加载properties文件 (加载整个工程的包括第三方jar包中的配置文件, 相当猛)核心内容小结容器的操作创建容器方式一: 类路径加载配置文件方式二: 文件路径加载配置文件加载多个配置文件 (合并的效果)获取bean方式一: 使用bean名称获取方式二: 使用bean名称获取并指定类型方式三: 使用bean类型获取容器类层次结构BeanFactory是IoC容器的顶层接口初始化BeanFactory对象时加载的bean延迟加载ApplicationContext接口是Spring容器的核心接口初始化时bean立即加载ApplicationContext接口提供基础的bean操作相关方法通过其他接口扩展其功能ApplicationContext接囗常用初始化类ClassPathXmlApplicationContextFileSystemXmlApplicationContextBeanFactory是Spring最高层级接口BeanFactory是Spring1.0使用的Ioc容器接口类路径加载配置文件BeanFactory创建完毕后所有的bean均为延迟加载ApplicationContext创建完毕后, 所有的bean均为立即加载, 可以调整, 代码如下ApplicationContext接口的功能比BeanFactory更多, 并且扩张了若干功能子接口, 所以现在都用这个注解开发注解定义Bean使用注解定义Bean的步骤使用Component定义bean核心配置文件中通过组件扫描加载beanSpring提供Component注解的三个衍生注解衍生注解和Componen注解的作用完全一样作用就是语义更好, 方便区分bean的作用, 推荐使用Controller: 用于表现层bean定义Service: 用于业务层bean定义Repository: 用于数据层bean定义纯注解开发模式Spring3.0开启了纯注解开发模式使用ava类替代配置文件开启了Spring快速开发赛道创建配置文件类代替Spring核心配置文件Configuration注解用于设定当前类为配置类Configuration的作用就是告诉Spring该类是一个配置类, 解析后的内容与xml模板的内容一致ComponentScan注解替代的是context:component-scan标签, 告诉Spring加载Bean的范围只要组件在加载范围内, 并且添加了组件组件, 该组件就会被Spring Ioc容器管理ComponentScan注解用于设定扫描路径此注解只能添加一次多个数据请用数组格式切换Spring创建IoC容器的方式读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象Bean的管理使用scope定义bean作用范围使用PostConstruct、PreDestroy定义bean生命周期依赖注入复杂类型的注入使用 Autowired 开启自动装配模式(按类型)注意: 自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据因此无需提供setter方法注意: 自动装配建议使用无参构造方法创建对象(默认)如果不提供对应构造方法请提供唯一的构造方法使用Qualifier注解开启指定名称装配bean注意: Qualifier注解无法单独使用必须配合Autowired注解使用作用: Autowired按类型装配, 如果同一类型对象有多个, 配置会失败, 可以使用该注解按名称进行匹配简单类型的注入使用Value实现简单类型注入使用PropertySource注解加载properties文件该注解是加载配置文件类上注意:路径仅支持单一文件配置多文件请使用数组格式配置不允许使用通配符*取值的语法就是 ${}第三bean的管理最简单的方式: 使用Bean配置第三方bean在配置类文件中定义一个方法获得要管理的对象添Bean表示当前方法的返回值是一个bean这种方式会造成Spring配置类文件的臃肿和混乱推荐的方式: 使用独立的配置类管理第三方bean该方式是把定义Bean的方法提取到独立的文件中这样提取出来, 就是个普通类文件, Spirng配置类文件扫描不到, 这个ben就无法被Spring Ioc容器管理下一步的目标就是把这个独立的配置类加入核心配置方式1: 导入式 (推荐使用)使用Import注解手动加入配置类到核心配置此注解只能添加一次多个数据请用数组格式方式2: 扫描式给独立的配置类加上注解使用Componentscan注解扫描配置类所在的包加载对应的配置类信息第三方bean依赖注入简单类型依赖注入: 成员变量引用类型依赖注入: 方法形参引用类型注入只需要为bean定义方法设置形参即可容器会根据类型自动装配对象XML配置与注解配置比较框架整合整合MyBatis使用传统方式整合MyBatis开发引入mybatis坐标在应用程序中创建数据库连接, 然后查询数据 (App.Class)创建数据库连接需要配置数据库连接参数, 这里使用xml配置文件的形式 (resources/SqlMapConfig.xml)Spring整合MyBatis, 就是把MyBatis连接对象(SqlSessionFactory)交给Spring管理, 不再自己创建新增两个依赖包把连接数据封装成数据源对象, 并注册为bean把mybatis的配置封装成配置对象, 并注册为bean从spring ioc获取数据库连接对象, 查询数据强调一下 配置Bean 与 配置文件 的对应关系整合JUnitspring整合JUnit测试框架的步骤导入坐标使用Spring整合Junit专用的类加载器RunWith 指定JUnit的类加载器ContextConfiguration 指定 Spring配置文件