基于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();
    }
}
相关推荐
程序员黑豆5 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
风流 少年6 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅6 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
小席是个热心肠6 小时前
AI相关的自我学习
java·人工智能·学习
Java成神之路-8 小时前
Spring Cloud 微服务契约先行:为什么 Controller 建议要实现 Feign 接口?
spring·spring cloud·微服务
数智化管理手记9 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
cfm_29149 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统10 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
0x5311 小时前
Java网络编程(二)
java·服务器·网络
Flittly11 小时前
【雕虫大技】Agent 动态 Skill 供应链安全加固(三):输出校验与治理闭环实战
java·spring boot·spring