基于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();
    }
}
相关推荐
Flittly2 小时前
【SpringAIAlibaba新手村系列】(13)Tool Calling 函数工具调用技术
java·spring boot·spring·ai
xdscode2 小时前
Spring 依赖注入方式全景解析
java·后端·spring
爱吃烤鸡翅的酸菜鱼2 小时前
Java 事件发布-订阅机制全解析:从原生实现到主流中间件
java·中间件·wpf·事件·发布订阅
无限码力2 小时前
华为OD技术面真题 - JAVA开发- spring框架 - 7
java·开发语言·华为od·华为od面试真题·华为odjava八股文·华为odjava开发题目·华为odjava开发高频题目
Lyyaoo.2 小时前
【JAVA基础面经】JAVA中的异常
java·开发语言
一定要AK3 小时前
JVM 全体系深度解析笔记
java·jvm·笔记
coder阿龙3 小时前
基于SpringAI+Qdrant+Ollama本地模型和向量数据库开发问答和RAG检索
java·数据库·spring boot·ai·数据库开发
Gofarlic_OMS3 小时前
HyperWorks用户仿真行为分析与许可证资源分点配置
java·大数据·运维·服务器·人工智能
徒 花3 小时前
Python知识学习08
java·python·算法