镇江市精神文明建设网站,磁县网站设计公司,签订网站建设合同应注意,网站怎么做留言板块第二章 SpringFramework
四、SpringIoC 实践和应用
2. 基于 XML 配置方式组件管理
2.5 实验五#xff1a;高级特性#xff1a;FactoryBean 特性和使用
2.5.1 FactoryBean 简介 FactoryBean 接口是Spring IoC容器实例化逻辑的可插拔性点。 用于配置复杂的Bean对象#x…第二章 SpringFramework
四、SpringIoC 实践和应用
2. 基于 XML 配置方式组件管理
2.5 实验五高级特性FactoryBean 特性和使用
2.5.1 FactoryBean 简介 FactoryBean 接口是Spring IoC容器实例化逻辑的可插拔性点。 用于配置复杂的Bean对象可以将创建过程存储在FactoryBean 的getObject方法 FactoryBeanT 接口提供三种方法 T getObject(): 返回此工厂创建的对象的实例。该返回值会被存储到IoC容器boolean isSingleton(): 如果此 FactoryBean 返回单例则返回 true 否则返回 false 。此方法的默认实现返回 true 注意lombok插件使用可能影响效果。Class? getObjectType(): 返回 getObject() 方法返回的对象类型如果事先不知道类型则返回 null 。 2.5.2 FactoryBean 使用场景
代理类的创建第三方框架整合复杂对象实例化等
2.5.3 Factorybean 应用
2.5.3.1 准备FactoryBean实现类
// 实现FactoryBean接口时需要指定泛型
// 泛型类型就是当前工厂要生产的对象的类型
public class HappyFactoryBean implements FactoryBeanHappyMachine {private String machineName;public String getMachineName() {return machineName;}public void setMachineName(String machineName) {this.machineName machineName;}Overridepublic HappyMachine getObject() throws Exception {// 方法内部模拟创建、设置一个对象的复杂过程HappyMachine happyMachine new HappyMachine();happyMachine.setMachineName(this.machineName);return happyMachine;}Overridepublic Class? getObjectType() {// 返回要生产的对象的类型return HappyMachine.class;}
}2.5.3.2 配置FactoryBean实现类
!-- FactoryBean机制 --
!-- 这个bean标签中class属性指定的是HappyFactoryBean但是将来从这里获取的bean是HappyMachine对象 --
bean idhappyMachine7 classcom.alex.ioc.HappyFactoryBean!-- property标签仍然可以用来通过setXxx()方法给属性赋值 --property namemachineName valueiceCreamMachine/
/bean2.5.3.3 测试读取FactoryBean和FactoryBean.getObject对象
Test
public void testExperiment07() {ApplicationContext iocContainer new ClassPathXmlApplicationContext(spring-bean-07.xml);//注意: 直接根据声明FactoryBean的id,获取的是getObject方法返回的对象HappyMachine happyMachine iocContainer.getBean(happyMachine7,HappyMachine.class);System.out.println(happyMachine happyMachine);//如果想要获取FactoryBean对象, 直接在id前添加符号即可! happyMachine7 这是一种固定的约束Object bean iocContainer.getBean(happyMachine7);System.out.println(bean bean);
}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 生命周期管理。
2.6 实验六基于 XML 方式整合三层架构组件
2.6.1 需求分析
搭建一个三层架构案例模拟查询全部学生学生表信息持久层使用JdbcTemplate和Druid技术使用XML方式进行组件管理 2.6.2 数据库准备
create database studb;use studb;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, 高中二班);2.6.3 项目准备
2.6.3.1 项目创建
spring-xml-practice-02
2.6.3.2 依赖导入
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 2.6.3.3 实体类准备
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 \ };}
}2.6.4 JdbcTemplate技术讲解
为了在特定领域帮助我们简化代码Spring 封装了很多 『Template』形式的模板类。例如RedisTemplate、RestTemplate 等等包括我们今天要学习的 JdbcTemplate。jdbc.properties 提取数据库连接信息
alex.urljdbc:mysql://localhost:3306/studb
alex.drivercom.mysql.cj.jdbc.Driver
alex.usernameroot
alex.passwordrootspringioc配置文件
?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${alex.url}/property namedriverClassName value${alex.driver}/property nameusername value${alex.username}/property namepassword value${alex.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);}}2.6.5 三层架构搭建和实现
2.6.5.1 持久层
//接口
public interface StudentDao {/*** 查询全部学生数据* return*/ListStudent queryAll();
}//实现类
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;}
}2.6.5.2 业务层
//接口
public interface StudentService {/*** 查询全部学员业务* return*/ListStudent findAll();}//实现类
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;}
}2.6.5.3 表述层
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);}
}2.6.6 三层架构IoC配置
?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${alex.url}/property namedriverClassName value${alex.driver}/property nameusername value${alex.username}/property namepassword value${alex.password}//bean!-- 配置 JdbcTemplate --bean idjdbcTemplate classorg.springframework.jdbc.core.JdbcTemplate!-- 装配数据源 --property namedataSource refdruidDataSource//beanbean idstudentDao classcom.alex.dao.impl.StudentDaoImplproperty namejdbcTemplate refjdbcTemplate //beanbean idstudentService classcom.alex.service.impl.StudentServiceImplproperty namestudentDao refstudentDao //beanbean idstudentController classcom.alex.controller.StudentControllerproperty namestudentService refstudentService //bean/beans2.6.7 运行测试
public class ControllerTest {Testpublic void testRun(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-ioc.xml);StudentController studentController applicationContext.getBean(StudentController.class);studentController.findAll();}2.6.8 XMLIoC方式问题总结
注入的属性必须添加setter方法、代码结构乱配置文件和Java代码分离、编写不是很方便XML配置文件解析效率低