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

南宁快速网站建设电话网站三网合一

南宁快速网站建设电话,网站三网合一,淘宝客单页网站,wordpress给图片固定尺寸本章概要 基于XML配置方式组件管理 实验一#xff1a; 组件#xff08;Bean#xff09;信息声明配置#xff08;IoC#xff09;实验二#xff1a; 组件#xff08;Bean#xff09;依赖注入配置#xff08;DI#xff09;实验三#xff1a; IoC 容器创建和使用实验四…本章概要 基于XML配置方式组件管理 实验一 组件Bean信息声明配置IoC实验二 组件Bean依赖注入配置DI实验三 IoC 容器创建和使用实验四 高级特性组件Bean作用域和周期方法配置实验五 高级特性FactoryBean特性和使用实验六 基于XML方式整合三层架构组件 4.2 基于XML配置方式组件管理 源码ssm-spring-part.rar 4.2.1 实验一 组件Bean信息声明配置IoC 4.2.1.1 目标Spring IoC 容器管理一个或多个 bean 这些 Bean 是使用您提供给容器的配置元数据创建的例如以 XML 定义的形式。我们学习如何通过定义XML配置文件声明组件类信息交给 Spring 的 IoC 容器进行组件管理 4.2.1.2 思路 4.2.1.3 准备项目 创建 maven 工程spring-ioc-xml-01导入 SpringIoC 相关依赖pom.xml dependencies!--spring context依赖--!--当你引入Spring Context依赖之后表示将Spring的基础依赖引入了--dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion6.0.6/version/dependency!--junit5测试--dependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter-api/artifactIdversion5.3.1/version/dependency /dependencies4.2.1.4 基于无参数构造函数 当通过构造函数方法创建一个 bean组件对象 时所有普通类都可以由 Spring 使用并与之兼容。也就是说正在开发的类不需要实现任何特定的接口或以特定的方式进行编码。只需指定 Bean 类信息就足够了。但是默认情况下我们需要一个默认空构造函数。 准备组件类 package com.atguigu.ioc01; public class HappyComponent {//默认包含无参数构造函数public void doWork() {System.out.println(HappyComponent.doWork);} }xml配置文件编写 创建携带spring约束的xml配置文件 编写配置文件 文件resources/spring-bean-01.xml !-- 实验一 [重要]创建bean -- bean idhappyComponent classcom.atguigu.ioc01.HappyComponent/bean标签通过配置bean标签告诉IOC容器需要创建对象的组件信息id属性bean的唯一标识,方便后期获取Beanclass属性组件类的全限定符注意要求当前组件类必须包含无参数构造函数 4.2.1.5 基于静态工厂方法实例化除了使用构造函数实例化对象还有一类是通过工厂模式实例化对象 接下来我们讲解如何定义使用静态工厂方法创建Bean的配置 准备组件类 package com.atguigu.ioc01; public class ClientService {private static ClientService clientService new ClientService();private ClientService() {}public static ClientService createInstance() {return clientService;} }xml 配置文件编写 文件resources/spring-bean-01.xml bean idclientService classcom.atguigu.ioc01.ClientService factory-methodcreateInstance/class属性指定工厂类的全限定符factory-method: 指定静态工厂方法注意该方法必须是static方法。 4.2.1.6 基于实例工厂方法实例化 接下来我们讲解下如何定义使用实例工厂方法创建Bean的配置 准备组建类 package com.atguigu.ioc01;public class DefaultServiceLocator {private static ClientServiceImpl clientService new ClientServiceImpl();public ClientServiceImpl createClientServiceInstance() {return clientService;} }package com.atguigu.ioc; public class ClientServiceImpl { }xml 配置文件编写 文件resources/spring-bean-01.xml !-- 将工厂类进行ioc配置 -- bean idserviceLocator classcom.atguigu.ioc01.DefaultServiceLocator/bean!-- 根据工厂对象的实例工厂方法进行实例化组件对象 -- bean idclientService factory-beanserviceLocator factory-methodcreateClientServiceInstance/factory-bean 属性指定当前容器中工厂 Bean 的名称。actory-method: 指定实例工厂方法名。注意实例方法必须是非static的 4.2.1.6 图解 IoC 配置流程 4.2.2 实验二 组件Bean依赖注入配置DI 4.2.2.1 目标通过配置文件,实现IoC容器中Bean之间的引用依赖注入DI配置。 主要涉及注入场景基于构造函数的依赖注入和基于 Setter 的依赖注入。 4.2.2.2 思路 4.2.2.3 基于构造函数的依赖注入单个构造参数 介绍 基于构造函数的 DI 是通过容器调用具有多个参数的构造函数来完成的每个参数表示一个依赖项。下面的示例演示一个只能通过构造函数注入进行依赖项注入的类 准备组件类 package com.atguigu.ioc02;public class UserDao { }package com.atguigu.ioc02;public class UserService {private UserDao userDao;public UserService(UserDao userDao) {this.userDao userDao;} }编写配置文件 文件resources/spring-bean-02.xml beans!-- 引用类bean声明 --bean iduserService classcom.atguigu.ioc02.UserService!-- 构造函数引用 --constructor-arg refuserDao//bean!-- 被引用类bean声明 --bean iduserDao classcom.atguigu.ioc02.UserDao/ /beansconstructor-arg 标签可以引用构造参数 ref 引用其他 bean 的标识。 4.2.2.4 基于构造函数的依赖注入多构造参数解析 介绍 基于构造函数的 DI 是通过容器调用具有多个参数的构造函数来完成的每个参数表示一个依赖项。下面的示例演示通过构造函数注入多个参数参数包含其他bean和基本数据类型 准备组件类 package com.atguigu.ioc03; public class UserDao { }package com.atguigu.ioc03; public class UserService {private UserDao userDao;private int age;private String name;public UserService(int age , String name ,UserDao userDao) {this.userDao userDao;this.age age;this.name name;} }编写配置文件 spring-bean-03.xml !-- 场景1: 多参数可以按照相应构造函数的顺序注入数据 -- beansbean iduserService classcom.atguigu.ioc03.UserService!-- value直接注入基本类型值 --constructor-arg value18/constructor-arg value赵伟风/constructor-arg refuserDao//bean!-- 被引用类bean声明 --bean iduserDao classcom.atguigu.ioc03.UserDao/ /beans!-- 场景2: 多参数可以按照相应构造函数的名称注入数据 -- beansbean iduserService classcom.atguigu.ioc03.UserService!-- value直接注入基本类型值 --constructor-arg namename value赵伟风/constructor-arg nameuserDao refuserDao/constructor-arg nameage value18//bean!-- 被引用类bean声明 --bean iduserDao classcom.atguigu.ioc03.UserDao/ /beans!-- 场景2: 多参数可以按照相应构造函数的角标注入数据 index从0开始 构造函数(0,1,2....) -- beansbean iduserService classcom.atguigu.ioc03.UserService!-- value直接注入基本类型值 --constructor-arg index1 value赵伟风/constructor-arg index2 refuserDao/constructor-arg index0 value18//bean!-- 被引用类bean声明 --bean iduserDao classcom.atguigu.ioc03.UserDao/ /beansconstructor-arg标签指定构造参数和对应的值constructor-arg标签name属性指定参数名、index属性指定参数角标、value属性指定普通属性值 4.2.2.5 基于Setter方法依赖注入 介绍 开发中除了构造函数注入DI更多的使用的Setter方法进行注入下面的示例演示一个只能使用纯 setter 注入进行依赖项注入的类。 准备组件类 package com.atguigu.ioc04; public class MovieFinder { } package com.atguigu.ioc04;public class SimpleMovieLister {private MovieFinder movieFinder;private String movieName;public void setMovieFinder(MovieFinder movieFinder) {this.movieFinder movieFinder;}public void setMovieName(String movieName) {this.movieName movieName;}// business logic that actually uses the injected MovieFinder is omitted... }编写配置文件 spring-bean-04.xml bean idsimpleMovieLister classcom.atguigu.ioc04.SimpleMovieLister!-- setter方法注入movieFinder对象的标识idname 属性名 ref 引用bean的id值--property namemovieFinder refmovieFinder /!-- setter方法注入基本数据类型movieNamename 属性名 value 基本类型值--property namemovieName value消失的她/ /beanbean idmovieFinder classcom.atguigu.ioc04.MovieFinder/property标签 可以给setter方法对应的属性赋值property 标签 name属性代表set方法标识、ref代表引用bean的标识id、value属性代表基本属性值 总结 依赖注入DI包含引用类型和基本数据类型同时注入的方式也有多种主流的注入方式为setter方法注入和构造函数注入两种注入语法都需要掌握 特别注意 引用其他bean使用ref属性。直接注入基本类型值使用value属性。 4.2.3 实验三 IoC容器创建和使用 介绍 上面的实验只是讲解了如何在XML格式的配置文件编写IoC和DI配置如图 想要配置文件中声明组件类信息真正的进行实例化成Bean对象和形成Bean之间的引用关系我们需要声明IoC容器对象读取配置文件实例化组件和关系维护的过程都是在IoC容器中实现的 容器实例化 package com.atguigu.ioc05;public class HappyComponent {// 默认包含无参数构造函数public void doWork() {System.out.println(HappyComponent.doWork);} }spring-bean-05.xml bean idhappyComponent classcom.atguigu.ioc05.HappyComponent/测试类SpringIocTest.java package com.atguigu.test;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpringIocTest {public void createIoc() {// 方式1:实例化并且指定配置文件// 参数String...locations 传入一个或者多个配置文件ApplicationContext context new ClassPathXmlApplicationContext(spring-bean-05.xml);// 方式2:先实例化再指定配置文件最后刷新容器触发Bean实例化动作 [springmvc源码和contextLoadListener源码方式]ClassPathXmlApplicationContext context1 new ClassPathXmlApplicationContext();// 设置配置配置文件,方法参数为可变参数,可以设置一个或者多个配置context1.setConfigLocations(spring-bean-05.xml);// 后配置的文件,需要调用refresh方法,触发刷新配置context1.refresh();} }Bean对象读取 测试类SpringIocTest.java Test public void getBeanFromIoc() {//先创建IOC容器对象ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext();applicationContext.setConfigLocations(spring-bean-05.xml);applicationContext.refresh();// 方式1: 根据id获取// 没有指定类型,返回为Object,需要类型转化!HappyComponent happyComponent1 (HappyComponent) applicationContext.getBean(happyComponent);// 使用组件对象happyComponent1.doWork();// 方式2: 根据类型获取// 根据类型获取,但是要求,同类型(当前类,或者之类,或者接口的实现类)只能有一个对象交给IoC容器管理// 配置两个或者以上出现: org.springframework.beans.factory.NoUniqueBeanDefinitionException 问题HappyComponent happyComponent2 applicationContext.getBean(HappyComponent.class);happyComponent2.doWork();// 方式3: 根据id和类型获取HappyComponent happyComponent3 applicationContext.getBean(happyComponent, HappyComponent.class);happyComponent3.doWork();System.out.println(happyComponent1 happyComponent2);System.out.println(happyComponent2 happyComponent3); }4.2.4 实验四 高级特性组件Bean作用域和周期方法配置 4.2.4.1 组件周期方法配置 周期方法概念 我们可以在组件类中定义方法然后当IoC容器实例化和销毁组件对象的时候进行调用这两个方法我们成为生命周期方法类似于Servlet的init/destroy方法,我们可以在周期方法完成初始化和释放资源等工作。 周期方法声明 package com.atguigu.ioc06;public class BeanOne {// 周期方法要求 方法命名随意但是要求方法必须是 public void 无形参列表public void init() {// 初始化逻辑System.out.println(BeanOne init);} }package com.atguigu.ioc06;public class BeanTwo {public void cleanup() {// 释放资源逻辑System.out.println(BeanTwo cleanup);} }周期方法配置 spring-bean-06.xml beansbean idbeanOne classcom.atguigu.ioc06.BeanOne init-methodinit /bean idbeanTwo classcom.atguigu.ioc06.BeanTwo destroy-methodcleanup / /beans测试 Test public void test06(){// 创建iod容器自动实例化ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext(spring-bean-06.xml);// 正常结束ioc容器自动销毁context.close(); }4.2.4.2 组件作用域配置 Bean 作用域概念 bean 标签声明Bean只是将Bean的信息配置给SpringIoC容器在IoC容器中这些bean标签对应的信息转成Spring内部 BeanDefinition 对象BeanDefinition 对象内包含定义的信息id,class,属性等等 这意味着BeanDefinition与类概念一样SpringIoC容器可以可以根据BeanDefinition对象反射创建多个Bean对象实例。 具体创建多少个Bean的实例对象由Bean的作用域Scope属性指定 作用域可选值 取值含义创建对象的时机默认值singleton在 IOC 容器中这个 bean 的对象始终为单实例IOC 容器初始化时是prototype这个 bean 在 IOC 容器中有多个实例获取 bean 时否 如果是在WebApplicationContext环境下还会有另外两个作用域但不常用 取值含义创建对象的时机默认值request请求范围内有效的实例每次请求否session会话范围内有效的实例每次会话否 作用域配置配置 scope 范围 package com.atguigu.ioc06;public class HappyMachine {private String machineName;public String getMachineName() {return machineName;}public void setMachineName(String machineName) {this.machineName machineName;} }package com.atguigu.ioc06;public class HappyComponent {private String componentName;public String getComponentName() {return componentName;}public void setComponentName(String componentName) {this.componentName componentName;} }spring-bean-06.xml !--bean的作用域准备两个引用关系的组件类即可-- !-- scope属性取值singleton默认值bean在IOC容器中只有一个实例IOC容器初始化时创建对象 -- !-- scope属性取值prototypebean在IOC容器中可以有多个实例getBean()时创建对象 -- bean idhappyMachine8 scopeprototype classcom.atguigu.ioc06.HappyMachineproperty namemachineName valuehappyMachine/ /beanbean idhappyComponent8 scopesingleton classcom.atguigu.ioc06.HappyComponentproperty namecomponentName valuehappyComponent/ /bean作用域测试 Test public void testExperiment08() {ApplicationContext iocContainer new ClassPathXmlApplicationContext(spring-bean-06.xml);HappyMachine8 bean iocContainer.getBean(HappyMachine8.class);HappyMachine8 bean1 iocContainer.getBean(HappyMachine8.class);//多例对比 falseSystem.out.println(bean bean1);HappyComponent8 bean2 iocContainer.getBean(HappyComponent8.class);HappyComponent8 bean3 iocContainer.getBean(HappyComponent8.class);//单例对比 trueSystem.out.println(bean2 bean3); }4.2.5 实验五 高级特性FactoryBean 特性和使用 4.2.5.1 FactoryBean 简介 FactoryBean 接口是Spring IoC容器实例化逻辑的可插拔性点。用于配置复杂的Bean对象可以将创建过程存储在FactoryBean 的getObject方法FactoryBean 接口提供三种方法 T getObject():返回此工厂创建的对象的实例。该返回值会被存储到IoC容器boolean isSingleton():如果此 FactoryBean 返回单例则返回 true 否则返回 false 。此方法的默认实现返回 true 注意lombok插件使用可能影响效果。Class? getObjectType(): 返回 getObject() 方法返回的对象类型如果事先不知道类型则返回 null 。 4.2.5.2 FactoryBean 使用场景 代理类的创建第三方框架整合复杂对象实例化等 4.2.5.3 Factorybean应用 准备FactoryBean实现类 package com.atguigu.ioc07;import com.atguigu.ioc06.HappyMachine8; import org.springframework.beans.factory.FactoryBean;// 实现FactoryBean接口时需要指定泛型 // 泛型类型就是当前工厂要生产的对象的类型 public class HappyFactoryBean implements FactoryBeanHappyMachine8 {private String machineName;public String getMachineName() {return machineName;}public void setMachineName(String machineName) {this.machineName machineName;}Overridepublic HappyMachine8 getObject() throws Exception {// 方法内部模拟创建、设置一个对象的复杂过程HappyMachine8 happyMachine new HappyMachine8();happyMachine.setMachineName(this.machineName);return happyMachine;}Overridepublic Class? getObjectType() {// 返回要生产的对象的类型return HappyMachine8.class;} }配置FactoryBean实现类 !-- FactoryBean机制 -- !-- 这个bean标签中class属性指定的是HappyFactoryBean但是将来从这里获取的bean是HappyMachine对象 -- bean idhappyMachine7 classcom.atguigu.ioc07.HappyFactoryBean!-- property标签仍然可以用来通过setXxx()方法给属性赋值 --property namemachineName valueiceCreamMachine/ /bean测试读取FactoryBean和FactoryBean.getObject对象 Test public void testExperiment07() {ApplicationContext iocContainer new ClassPathXmlApplicationContext(spring-bean-07.xml);// 注意: 直接根据声明FactoryBean的id,获取的是getObject方法返回的对象HappyMachine8 happyMachine iocContainer.getBean(happyMachine7, HappyMachine8.class);System.out.println(happyMachine7 happyMachine);// 如果想要获取FactoryBean对象, 直接在id前添加符号即可! happyMachine7 这是一种固定的约束Object bean iocContainer.getBean(happyMachine7);System.out.println(bean bean); }4.2.5.4 FactoryBean 和 BeanFactory 区别 **FactoryBean **是 Spring 中一种特殊的 bean可以在 getObject() 工厂方法自定义的逻辑创建Bean是一种能够生产其他 Bean 的 Bean。FactoryBean 在容器启动时被创建而在实际使用时则是通过调用 getObject() 方法来得到其所生产的 Bean。因此FactoryBean 可以自定义任何所需的初始化逻辑生产出一些定制化的 bean。 一般情况下整合第三方框架都是通过定义FactoryBean实现 BeanFactory 是 Spring 框架的基础其作为一个顶级接口定义了容器的基本行为例如管理 bean 的生命周期、配置文件的加载和解析、bean 的装配和依赖注入等。BeanFactory 接口提供了访问 bean 的方式例如 getBean() 方法获取指定的 bean 实例。 它可以从不同的来源例如 Mysql 数据库、XML 文件、Java 配置类等获取 bean 定义并将其转换为 bean 实例。同时BeanFactory 还包含很多子类例如ApplicationContext 接口提供了额外的强大功能。 总的来说FactoryBean 和 BeanFactory 的区别主要在于前者是用于创建 bean 的接口它提供了更加灵活的初始化定制功能而后者是用于管理 bean 的框架基础接口提供了基本的容器功能和 bean 生命周期管理。 4.2.6 实验六 基于XML方式整合三层架构组件 4.2.6.1 需求分析 搭建一个三层架构案例模拟查询全部学生学生表信息持久层使用JdbcTemplate和Druid技术使用XML方式进行组件管理 4.2.6.2 数据库准备 CREATE TABLE students (id INT PRIMARY KEY,name VARCHAR(50) NOT NULL,gender VARCHAR(10) NOT NULL,age INT,class VARCHAR(50) );INSERT INTO students (id, name, gender, age, class) VALUES(1, 张三, 男, 20, 高中一班),(2, 李四, 男, 19, 高中二班),(3, 王五, 女, 18, 高中一班),(4, 赵六, 女, 20, 高中三班),(5, 刘七, 男, 19, 高中二班),(6, 陈八, 女, 18, 高中一班),(7, 杨九, 男, 20, 高中三班),(8, 吴十, 男, 19, 高中二班);4.2.6.3 项目准备 项目创建spring-xml-practice-02依赖导入 dependencies!--spring context依赖--!--当你引入SpringContext依赖之后表示将Spring的基础依赖引入了--dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion6.0.6/version/dependency!-- 数据库驱动和连接池--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.25/version/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.2.8/version/dependency!-- spring-jdbc --dependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion6.0.6/version/dependency/dependencies实体类准备 public class Student {private Integer id;private String name;private String gender;private Integer age;private String classes;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender gender;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;}public String getClasses() {return classes;}public void setClasses(String classes) {this.classes classes;}Overridepublic String toString() {return Student{ id id , name name \ , gender gender \ , age age , classes classes \ };} }4.2.6.4 JdbcTemplate 技术讲解 为了在特定领域帮助我们简化代码Spring 封装了很多 『Template』形式的模板类。例如RedisTemplate、RestTemplate 等等包括现在要学习的 JdbcTemplate。 jdbc.properties文件提取数据库连接信息 atguigu.urljdbc:mysql://localhost:3306/studb atguigu.drivercom.mysql.cj.jdbc.Driver atguigu.usernameroot atguigu.passwordrootspring-ioc.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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd!-- 导入外部属性文件 --context:property-placeholder locationclasspath:jdbc.properties /!-- 配置数据源 --bean iddruidDataSource classcom.alibaba.druid.pool.DruidDataSourceproperty nameurl value${atguigu.url}/property namedriverClassName value${atguigu.driver}/property nameusername value${atguigu.username}/property namepassword value${atguigu.password}//bean!-- 配置 JdbcTemplate --bean idjdbcTemplate classorg.springframework.jdbc.core.JdbcTemplate!-- 装配数据源 --property namedataSource refdruidDataSource//bean/beans基于jdbcTemplate的CRUD使用 public class JdbcTemplateTest {/*** 使用jdbcTemplate进行DML动作*/Testpublic void testDML() {ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-ioc.xml);JdbcTemplate jdbcTemplate applicationContext.getBean(JdbcTemplate.class);// TODO 执行插入一条学员数据String sql insert into students (id,name,gender,age,class) values (?,?,?,?,?);;/*参数1: sql语句参数2: 可变参数,占位符的值*/int rows jdbcTemplate.update(sql, 9, 十一, 男, 18, 二年三班);System.out.println(rows rows);}/*** 查询单条实体对象* public class Student {* private Integer id;* private String name;* private String gender;* private Integer age;* private String classes;*/Testpublic void testDQLForPojo() {String sql select id , name , age , gender , class as classes from students where id ? ;;ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-ioc.xml);JdbcTemplate jdbcTemplate applicationContext.getBean(JdbcTemplate.class);// 根据id查询Student student jdbcTemplate.queryForObject(sql, (rs, rowNum) - {// 自己处理结果映射Student stu new Student();stu.setId(rs.getInt(id));stu.setName(rs.getString(name));stu.setAge(rs.getInt(age));stu.setGender(rs.getString(gender));stu.setClasses(rs.getString(classes));return stu;}, 2);System.out.println(student student);}/*** 查询实体类集合*/Testpublic void testDQLForListPojo() {String sql select id , name , age , gender , class as classes from students ;;ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-ioc.xml);JdbcTemplate jdbcTemplate applicationContext.getBean(JdbcTemplate.class);/*query可以返回集合!BeanPropertyRowMapper就是封装好RowMapper的实现,要求属性名和列名相同即可*/ListStudent studentList jdbcTemplate.query(sql, new BeanPropertyRowMapper(Student.class));System.out.println(studentList studentList);}}4.2.6.5 三层架构搭建和实现 持久层 import com.atguigu.domain.Student; import java.util.List;// 接口 public interface StudentDao {/*** 查询全部学生数据** return*/ListStudent queryAll(); }import com.atguigu.dao.StudentDao; import com.atguigu.domain.Student; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate;import java.util.List;// 实现类 public class StudentDaoImpl implements StudentDao {private JdbcTemplate jdbcTemplate;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate jdbcTemplate;}/*** 查询全部学生数据** return*/Overridepublic ListStudent queryAll() {String sql select id , name , age , gender , class as classes from students ;;/*query可以返回集合!BeanPropertyRowMapper就是封装好RowMapper的实现,要求属性名和列名相同即可*/ListStudent studentList jdbcTemplate.query(sql, new BeanPropertyRowMapper(Student.class));return studentList;} }业务层 import com.atguigu.domain.Student;import java.util.List;// 接口 public interface StudentService {/*** 查询全部学员业务** return*/ListStudent findAll();}import com.atguigu.dao.StudentDao; import com.atguigu.domain.Student; import com.atguigu.service.StudentService;import java.util.List;// 实现类 public class StudentServiceImpl implements StudentService {private StudentDao studentDao;public void setStudentDao(StudentDao studentDao) {this.studentDao studentDao;}/*** 查询全部学员业务** return*/Overridepublic ListStudent findAll() {ListStudent studentList studentDao.queryAll();return studentList;} }表述层 import com.atguigu.domain.Student; import com.atguigu.service.StudentService;import java.util.List;public class StudentController {private StudentService studentService;public void setStudentService(StudentService studentService) {this.studentService studentService;}public void findAll() {ListStudent studentList studentService.findAll();System.out.println(studentList studentList);} }4.2.6.6 三层架构 IoC 配置 spring-ioc.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/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd!-- 导入外部属性文件 --context:property-placeholder locationclasspath:jdbc.properties /!-- 配置数据源 --bean iddruidDataSource classcom.alibaba.druid.pool.DruidDataSourceproperty nameurl value${atguigu.url}/property namedriverClassName value${atguigu.driver}/property nameusername value${atguigu.username}/property namepassword value${atguigu.password}//bean!-- 配置 JdbcTemplate --bean idjdbcTemplate classorg.springframework.jdbc.core.JdbcTemplate!-- 装配数据源 --property namedataSource refdruidDataSource//beanbean idstudentDao classcom.atguigu.dao.impl.StudentDaoImplproperty namejdbcTemplate refjdbcTemplate //beanbean idstudentService classcom.atguigu.service.impl.StudentServiceImplproperty namestudentDao refstudentDao //beanbean idstudentController classcom.atguigu.controller.StudentControllerproperty namestudentService refstudentService //bean/beans4.2.6.7 运行测试 import com.atguigu.controller.StudentController; import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class ControllerTest {Testpublic void testRun() {ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-ioc.xml);StudentController studentController applicationContext.getBean(StudentController.class);studentController.findAll();} }4.2.6.8 XML IoC 方式问题总结 注入的属性必须添加 setter 方法、代码结构乱配置文件和 Java 代码分离、编写不是很方便XML 配置文件解析效率低
http://wiki.neutronadmin.com/news/182755/

相关文章:

  • 怎样做免费网站会员做网站需要套模板
  • 企业网站管理系统 源码互联网装饰公司
  • 大学院系网站建设最新seo黑帽技术工具软件
  • 免费信息发布网站大全设计类网站排名
  • 如何给自己的网站做优化查排名官网
  • 加盟餐饮的网站建设注册一个免费的网站
  • 印刷 网站模板在线证件照生成器
  • 泰国房产网站大全深圳大簇激光公司网站
  • 网站建设三亚南京ui培训
  • 和女人做的电影网站网站中页面链接怎么做的
  • 制定一个网站建设方案wordpress增加邀请功能
  • cc网站域名注册西安企业网站搭建
  • 漳州 网站设计培训网站建设方案模板下载
  • 潍坊设计网站万网域名官网
  • 怎么开通网站和进行网页设计上海南山做网站
  • 浙江建设厅 继续教育 网站首页wordpress支持大数据处理
  • 医院网站建设细节科技公司排名
  • 网站建设者属于广告经营者吗网站建设公司面临的问题
  • 电子商务网站建设规划的论文企业如何建公司网站
  • 网站建设规划论文电商网站开发资金预算
  • 网站建设设计公司类网站织梦模板 带手机端做网站公司做网站公司有哪些
  • 鞍山百度做网站wordpress 打开满
  • 门户网站开发设计方案建筑网站源码
  • 网站哪里备案网站一个一个关键词做
  • wordpress 整站迁移陕西企业网站建设价格
  • 做网站的命题依据开发wap网站 转
  • 网站 备案号查询网站推广方法素材
  • windows8风格网站模板wordpress删除自定义分类
  • 泉州网站建设 乐本园阜阳网站制作公司报价
  • 网站建设中请期待app 官方网站 案例