基于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();
    }
}
相关推荐
keyipatience30 分钟前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
weixin_408099671 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
钱六两1 小时前
#3、SpringAI 接入deepSeek大模型(喂饭版)
java·spring boot·ai编程
Suhan422 小时前
IDEA 设置启动参数和环境变量
spring boot·spring·编辑器·idea
null_173 小时前
IntelliJ IDEA 极致流畅配置方案:Ultra 9 285K + 64GB 内存实测
java·ide·intellij-idea
Herbert_hwt3 小时前
建立Java程序开发
java·开发语言
好好沉淀3 小时前
@ExcelIgnoreUnannotated 和 @AutoMapper 详解
java
愚公移码3 小时前
蓝凌EKP18产品:流程虚拟机(PVM)
java·开发语言·前端
驰骋工作流3 小时前
流程引擎BPM设计之:流程消息
java·工作流引擎·bpm·jflow·ccflow
dogstarhuang3 小时前
从 0 到 1 搭建可收费的 API 开放平台(实战)
java·架构·api