基于xml、注解、JavaConfig实现spring的ioc

代码结构如下:

java 复制代码
//IUserDao
package com.example.dao;

public interface IUserDao {
    void getUser();
}
java 复制代码
//UserDao
package com.example.dao;

public class UserDao implements IUserDao {
    @Override
    public void getUser() {
        System.out.println("查询用户");
    }
}
java 复制代码
//IUserService 
package com.example.service;

public interface IUserService {
    void getUser();
}
java 复制代码
//UserService 
package com.example.service;

import com.example.dao.IUserDao;
import com.example.dao.UserDao;

public class UserService implements IUserService {
    IUserDao userDao = new UserDao();
    @Override
    public void getUser() {
        userDao.getUser();
    }
}
java 复制代码
//test
import com.example.service.IUserService;
import com.example.service.UserService;

public class Test {
    @org.junit.Test
    public void test(){
        IUserService userService = new UserService();
        userService.getUser();
    }
}
1.xml方式

在resources里新建spring.xml文件

XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>

<!-- 1.XML方式 -->
<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">
    <!-- 让Spring帮我们去new对象,对象直接的依赖也让spring帮我们进行组织  -->
    <bean class="com.example.service.UserService">
        <!-- 依赖注入 -->
        <property name="userDao" ref="userDao"></property>
    </bean>

    <bean class="com.example.dao.UserDao" name="userDao"></bean>
</beans>

注意:需要在UserService里面写set方法,名称为set加property的name

java 复制代码
//UserService 
package com.example.service;
import com.example.dao.IUserDao;

public class UserService implements IUserService {
    //依赖spring注入
    IUserDao userDao;

    public IUserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(IUserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void getUser() {
        userDao.getUser();
    }
}
java 复制代码
//test
import com.example.service.IUserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    @org.junit.Test
    public void test(){
        // 要依赖spring注入,就需要从spring容器中获取UserService
        ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("spring.xml");
        IUserService service = ioc.getBean(IUserService.class);
        service.getUser();
    }
}
2.注解方式

修改spring.xml文件

XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>

<!-- 2.注解  -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 告诉spring注解所在的位置 -->
    <context:component-scan base-package="com.example"></context:component-scan>
</beans>

修改UserService 和 UserDao ,test不做修改

java 复制代码
//UserService 
package com.example.service;
import com.example.dao.IUserDao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

//标识当前类交给spring去new,交给spring进行管理
@Component
public class UserService implements IUserService {
    //依赖spring注入
    //让spring自动注入进来
    @Autowired
    IUserDao userDao;

    @Override
    public void getUser() {
        userDao.getUser();
    }
}
java 复制代码
//UserDao 
package com.example.dao;

import org.springframework.stereotype.Component;

@Component
public class UserDao implements IUserDao {
    @Override
    public void getUser() {
        System.out.println("查询用户");
    }
}
3.JavaConfig方式

不再使用spring.xml 文件,新建JavaConfig类代替spring.xml 文件,UserService 和 UserDao仍使用注解

java 复制代码
//javaConfig
package com.example.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

// @Configuration = xml配置文件
@Configuration
// @ComponentScan("com.example") = <context:component-scan base-package="com.example"></context:component-scan>
@ComponentScan("com.example")
public class javaConfig {
}

修改test

java 复制代码
//test
import com.example.config.javaConfig;
import com.example.service.IUserService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
    @org.junit.Test
    public void test(){
        AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext(javaConfig.class);
        IUserService service = ioc.getBean(IUserService.class);
        service.getUser();
    }
}
相关推荐
野生技术架构师1 分钟前
Java 23 种设计模式:从踩坑到精通 —— 开篇及系列介绍
java·开发语言·设计模式
折哥的程序人生 · 物流技术专研5 分钟前
《Java 100 天进阶之路》第93篇:Redis实战应用:缓存策略与分布式锁(2026版)
java·redis·缓存·面试·架构·求职招聘
瓦特what?6 分钟前
位运算核心技巧与应用
java·jvm·算法
人道领域8 分钟前
【LeetCode刷题日记】90.子集Ⅱ--- 归纳题解
java·开发语言·leetcode
ch.ju14 分钟前
Java Programming Chapter 4——Characteristics of inheritance
java·开发语言
就叫_这个吧16 分钟前
tomcat在idea控制台乱码问题解决
java·tomcat·intellij-idea
霸道流氓气质25 分钟前
Spring AI Alibaba Skills 完整实战:从零构建智能会议助手
java·人工智能·spring
极客先躯36 分钟前
高级java每日一道面试题-2026年02月04日-实战篇[Docker]-如何在容器之间共享数据?
java·运维·网络·docker·容器·自动化·高级面试题
真实的菜36 分钟前
微服务架构痛点
java·微服务·架构
小楊不秃头37 分钟前
Spring:Bean的存储
java·spring·bean