Spring(1)-IOC-反射

本文深入探讨Spring框架中的IOC(控制反转)概念,并详细解析反射机制及其在Spring中的应用。通过具体代码示例和配置文件说明如何利用反射在运行时动态创建对象,避免硬编码new操作,实现更灵活的组件管理和依赖注入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring IOC(控制反转).(此文部分代码和配置文件来源于网络)
1.什么叫反射
2.常用方法
3.反射的代码:
  3.1主类
  3.2配置文件
     如果想要使用这种模式,那么你得搭建一个Spring的运行环境
   3.2.1依赖文件
   3.2.2spring.xml 
(非new的创建对象)

      a)无参构造函数创建对象
      b)有参构造函数创建对象
      c)索引构造函数创建对象
      d) 多例,非单实例
  3.3调用


1.什么叫反射
  
程序运行时进行自我检查. ​ 动态地对对象进行编译。 ​
   我的理解,相对于C++中的一个基类,通过配置文件,动态的生成子类。
   最重要不用new。
2.常用方法
 

getName() 获得类的完整名字
getPackage()获取此类所属的包
getSuperclass()获得此类的父类对应的Class对象
getField(String name)获得类的指定属性
getMethods()获得类的public类型的方法
getMethod (String name,Class [] args)获得类的指定方法


3.反射的代码:
  3.1主类
   

interface Worker 
{
    public abstract void work();
}

class Coder implements Worker {
    public void work() {
        System.out.println("I am coding.");
    }
}

class Leader implements Worker {
    public void work() {
        System.out.println("I am talking.");
    }
}

// 操作属性文件类
class init{
    public static Properties getPro() throws FileNotFoundException, IOException{
        Properties pro=new Properties();
        File f=new File("worker.properties");
        if(f.exists()){
            pro.load(new FileInputStream(f));
        }else{
            pro.setProperty("coder", "worker.Coder");
            pro.setProperty("leader", "worker.Leader");
            pro.store(new FileOutputStream(f), "WORKER CLASS");
        }
        return pro;
    }
}

// 构造工厂
class Factory{
    public static Worker getInstance(String ClassName) {
        Worker worker = null;
        try{
            worker = (Worker)Class.forName(ClassName).newInstance();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return worker;
    }
}

// 测试类
class Test {
    public static void main(String args[]){
        Properties pro=init.getPro();
        Worker worker = Factory.getInstance(pro.getProperty("coder")); // 
        if(worker!=null) {
            worker.work();
        }
        
    }
}


  3.2配置文件
   xxx.properties的格式命名,此处为worker.properies

coder=worker.Coder
leader=worker.Leader


  如果想要使用这种模式,那么你得搭建一个Spring的运行环境
   3.2.1依赖文件

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.zxl</groupId>
  <artifactId>MyProject</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>MyProject</name>
  <url>http://maven.apache.org</url>

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>4.3.0.RELEASE</spring.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
            <version>4.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.9</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.4</version>
        </dependency>
    </dependencies>
</project>



   3.2.2spring.xml 
      a)无参

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
         <!-- 配置Worker对象  无参-->
     <bean id="worker1" class="com.zxl.entity.Worker"></bean>
</beans>


      b)有参

 <!-- 通过有参构造函数创建对象 -->
     <bean id="worker1" class="com.zxl.entity.Worker">
        <constructor-arg name="userId" value="32"></constructor-arg>
        <constructor-arg name="name" value="随月踏清风"></constructor-arg>
     </bean>


      c)索引
 

<bean id="worker1" class="com.zxl.entity.Worker">
        <constructor-arg index="0" value="32"></constructor-arg>
        <constructor-arg index="1" value="随月踏清风"></constructor-arg>
</bean>

  d)  多例 非单例 scope="prototype", 一个bean对应多个实例对象。
   

<bean id="worker1" class="com.zxl.entity.Worker" scope="prototype">
<constructor-arg index="0" value="32"></constructor-arg>
<constructor-arg index="1" value="随月踏清风"></constructor-arg>
</bean>


  3.3调用
 

public class Test {
    public static void main(String[] args) {
        //1.加载spring.xml配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        //2.通过id值获取对象
        Worker worker1 = (Worker) applicationContext.getBean("worker1");
        System.out.println(worker1);
    }
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值