02-springIOC01-注解方式实现

使用注解的方式实现IOC

定义两个实体类

/**
 * @ClassName Address
 * @Description TODO
 * @Author zhongge
 * @Version 1.0
 */
public class Address {
    public String getLoc() {
        return loc;
    }

    public void setLoc(String loc) {
        this.loc = loc;
    }

    @Override
    public String toString() {
        return "Address{" +
                "loc='" + loc + '\'' +
                '}';
    }

    private String loc;

    public Address(String loc) {
        this.loc = loc;
    }

    public Address() {
    }
}


/**
 * @ClassName Student
 * @Description TODO
 * @Author zhongge
 * @Version 1.0
 */
public class Student {
    public Student() {
    }

    @Override
    public String toString() {
        return "Student{" +
                "address=" + address +
                ", id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    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 Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    private Address address;//地址
    private Integer id;
    private String name;
    private Integer age;

}

配置xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="address" class="com.zhongge.entity.Address">
        <property name="loc" value="贵州"></property>
    </bean>

    <bean id="student" class="com.zhongge.entity.Student">
        <property name="address" ref="address"></property>
        <property name="id" value="1001"></property>
        <property name="name" value="李四"></property>
        <property name="age" value="19"></property>
    </bean>
</beans>

测试结果

/**
 * @ClassName Main
 * @Description TODO
 * @Author zhongge
 * @Version 1.0
 */
public class Main {
    public static void main(String[] args) {
        //获取IOC容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-context.xml");
        //从IOC容器中获取对象
        System.out.println(applicationContext.getBean("address"));
        System.out.println(applicationContext.getBean("student"));
    }
}

结果:
image

补充知识

1️⃣ 构造器注入(不需要无参构造)

如果你想用有参构造直接创建 Student 对象,可以用 <constructor-arg> 标签:

<bean id="address" class="com.zhongge.entity.Address">
    <property name="loc" value="贵州"/>
</bean>

<bean id="student" class="com.zhongge.entity.Student">
    <constructor-arg ref="address"/>         <!-- 第一个参数 -->
    <constructor-arg value="1001"/>          <!-- 第二个参数 -->
    <constructor-arg value="李四"/>          <!-- 第三个参数 -->
    <constructor-arg value="19"/>            <!-- 第四个参数 -->
</bean>

特点:

  • 直接调用你定义的有参构造方法
  • 不需要无参构造
  • 参数顺序必须与构造方法一致

2️⃣ Setter 注入(需要无参构造)

这是你现在的写法,Spring 会:

  1. 调用无参构造创建对象
  2. 调用 setXxx() 方法注入属性
<bean id="address" class="com.zhongge.entity.Address">
    <property name="loc" value="贵州"/>
</bean>

<bean id="student" class="com.zhongge.entity.Student">
    <property name="address" ref="address"/>
    <property name="id" value="1001"/>
    <property name="name" value="李四"/>
    <property name="age" value="19"/>
</bean>

特点:

  • 必须有无参构造
  • 属性名要与 setXxx() 方法对应

3️⃣ p 命名空间注入(简化 Setter 注入)

可以用 p: 前缀简化 <property> 写法:

<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">

    <bean id="address" class="com.zhongge.entity.Address" p:loc="贵州"/>

    <bean id="student" class="com.zhongge.entity.Student"
          p:address-ref="address"
          p:id="1001"
          p:name="李四"
          p:age="19"/>
</beans>

特点:

  • 写法更简洁
  • 本质还是 Setter 注入,所以仍需要无参构造

4️⃣ 集合类型注入(可选)

如果你的类中有集合属性,可以这样配置:

<bean id="student" class="com.zhongge.entity.Student">
    <property name="address" ref="address"/>
    <property name="id" value="1001"/>
    <property name="name" value="李四"/>
    <property name="age" value="19"/>
    <property name="hobbies">
        <list>
            <value>篮球</value>
            <value>游泳</value>
        </list>
    </property>
</bean>

总结

  • 构造器注入<constructor-arg>,不要求无参构造
  • Setter 注入<property>p: 命名空间,必须有无参构造
  • 你的 Student 类有有参构造,如果想用 <property> 注入,就必须显式添加无参构造

基于xml的方式的优缺点

  • 缺点:基于 XML 的缺点是过于复杂
  • 优点:基于 XML 的方式一个类可以创建多个对象

posted on 2025-10-04 23:29  笨忠  阅读(1)  评论(0)    收藏  举报