(反射+内省机制的运用)简单模拟spring IoC容器的操作

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: (反射+内省机制的运用)简单模拟spring IoC容器的操作

简单模拟spring IoC容器的操作【管理对象的创建、管理对象的依赖关系,例如属性设置】

  • 实体类Hello
package com.shan.hello;
public class Hello {
  private String password;
  private String username;
  private Hello() {};
  public Hello(String username) {
    this.username = username;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  public void setUsername(String username) {
    this.username = username;
  }
  public void printUser() {
    System.out.println("hello " + username + ", your password is " + password);
  }
}


1、实例Hello对象-反射常用的方法,调用Class类中的newInstance();

  • 但是SpringIoC容器中必须存在一个和访问权限无关的无参构造器(例如Hello中的构造器可以是public,也可以是private)
  • 实体类Hello
public class Hello {
  private String password;
  private String username;
  private Hello() {};//bean 类必须存在一个无参数构造器(且该无参构造器和访问权限无关);

所以不是直接通过Class类的newInstance方法,而是先通过反射构建构造器Constructor,然后通过调用构造器Constructor的newInstance方法创建实例对象Hello

String className = "com.shan.hello.Hello";
    Hello hello = null; 
    //================================
    //实例Hello对象-反射常用的方法,调用Class类中的newInstance();
//    Object obj = Class.forName(className).newInstance();//因为通过测试得知实体必须存在一个(与访问性无关的)构造器,
    //所以不是直接通过Class类的newInstance方法,而是先通过反射构建构造器Constructor,然后通过调用构造器Constructor的newInstance方法创建实例对象
    //反射机制获取构造器
    Class clazz = Class.forName(className);
    Constructor con = clazz.getDeclaredConstructor();
    con.setAccessible(true);//设置构造器的可访问性
    Object obj = con.newInstance();
    hello = (Hello)obj;


2、✿ Spring 管理bean的原理:

① 通过 Resource 对象加载配置文件
② 解析配置文件,得到指定名称的 bean
③ 解析 bean 元素,id 作为 bean 的名字,class 用于反射得到 bean 的实例
  • 注意:此时,bean 类必须存在一个无参数构造器(且该无参构造器和访问权限无关);
④ 调用 getBean 方法的时候,从容器中返回对象实例;
■ 结论:就是把代码从 JAVA 文件中转移到了 XML 中。(即是将咱模拟的IoC容器代码的过程转移到xml文件中)


3、完整模拟IoC容器代码如下:

/* 实体类Hello */
public class Hello {
  private String password;
  private String username;
  private Hello() {};//bean 类必须存在一个无参数构造器`(且该无参构造器和访问权限无关);可以是public,也可以是private 
  public void setPassword(String password) {
    this.password = password;
  }
  public void setUsername(String username) {
    this.username = username;
  }
  public void printUser() {
    System.out.println("hello " + username + ", your password is " + password);
  }
}
/* 测试类 */
//简单模拟spring IoC容器的操作【管理对象的创建、管理对象的依赖关系,例如属性设置】
  @Test
  void testIoCMock() throws Exception {
    String className = "com.shan.hello.Hello";
    Hello hello = null; 
    //================================
    //实例Hello对象-反射常用的方法,调用Class类中的newInstance();
//    Object obj = Class.forName(className).newInstance();//因为通过测试得知实体必须存在一个(与访问性无关的)构造器,
    //所以不是直接通过Class类的newInstance方法,而是先通过反射构建构造器Constructor,然后通过调用构造器Constructor的newInstance方法创建实例对象
    //反射机制获取构造器
    Class clazz = Class.forName(className);
    Constructor con = clazz.getDeclaredConstructor();
    con.setAccessible(true);//设置构造器的可访问性
    Object obj = con.newInstance();
    hello = (Hello)obj;
    //内省机制操作javaBean属性
    BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class);
    PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
    for (PropertyDescriptor pd : pds) {
      //当前的属性的属性名
      String propertyName = pd.getName();
      if("username".equals(propertyName)) {
        pd.getWriteMethod().invoke(hello,"shan");
      }else if("password".equals(propertyName)) {
        pd.getWriteMethod().invoke(hello, "123");
      } 
    }
    hello.printUser();
  }
目录
相关文章
|
1天前
|
Java 测试技术 开发者
IoC容器有什么作用?
【4月更文挑战第30天】IoC容器有什么作用?
33 0
|
1天前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
22 0
|
1天前
|
XML Java 程序员
Spring特性之二——IOC控制反转
Spring特性之二——IOC控制反转
15 4
|
1天前
|
存储 安全 数据中心
【Docker 专栏】Docker 容器与宿主机的资源隔离机制
【5月更文挑战第8天】Docker容器利用Namespace和Cgroups实现资源隔离,保证CPU、内存、网络和存储的独立,提升资源利用率和系统安全性。资源隔离有助于简化应用部署与管理,但也带来资源竞争、监控管理及安全挑战。理解并善用资源隔离机制能实现更高效、安全的容器运行。随着技术进步,Docker容器资源隔离将持续优化。
【Docker 专栏】Docker 容器与宿主机的资源隔离机制
|
1天前
|
缓存 NoSQL Java
17:缓存机制-Java Spring
17:缓存机制-Java Spring
41 5
|
1天前
|
SQL Java 数据库连接
Springboot框架整合Spring JDBC操作数据
JDBC是Java数据库连接API,用于执行SQL并访问多种关系数据库。它包括一系列Java类和接口,用于建立数据库连接、创建数据库操作对象、定义SQL语句、执行操作并处理结果集。直接使用JDBC涉及七个步骤,包括加载驱动、建立连接、创建对象、定义SQL、执行操作、处理结果和关闭资源。Spring Boot的`spring-boot-starter-jdbc`简化了这些步骤,提供了一个在Spring生态中更便捷使用JDBC的封装。集成Spring JDBC需要添加相关依赖,配置数据库连接信息,并通过JdbcTemplate进行数据库操作,如插入、更新、删除和查询。
|
1天前
|
SQL Java 数据库连接
Springboot框架整合Spring Data JPA操作数据
Spring Data JPA是Spring基于ORM和JPA规范封装的框架,简化了数据库操作,提供增删改查等接口,并可通过方法名自动生成查询。集成到Spring Boot需添加相关依赖并配置数据库连接和JPA设置。基础用法包括定义实体类和Repository接口,通过Repository接口可直接进行数据操作。此外,JPA支持关键字查询,如通过`findByAuthor`自动转换为SQL的`WHERE author=?`查询。
|
1天前
|
安全 Java 开发者
在Spring框架中,IoC和AOP是如何实现的?
【4月更文挑战第30天】在Spring框架中,IoC和AOP是如何实现的?
23 0
|
1天前
|
Java 开发者 容器
IoC容器如何实现依赖注入?
【4月更文挑战第30天】IoC容器如何实现依赖注入?
21 0
|
1天前
|
XML Java 数据格式
如何配置IoC容器?
【4月更文挑战第30天】如何配置IoC容器?
20 0