基于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();
    }
}
相关推荐
咖啡八杯29 分钟前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路4 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
像我这样帅的人丶你还7 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
plainGeekDev9 小时前
GreenDAO → Room
android·java·kotlin
亦暖筑序14 小时前
Java 8老系统AI Workflow实战:把一次性AI对话升级成可恢复工作流
java·后端
敲代码的彭于晏15 小时前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
plainGeekDev16 小时前
ButterKnife → ViewBinding
android·java·kotlin
像我这样帅的人丶你还1 天前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩1 天前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构
tntxia1 天前
Mybatis的日志输入
java