spring —— IoC容器(二)

二、基于注解管理 bean

(一)Autowired 自动装配

(1)属性上自动装配

java 复制代码
package com.fourth.anno;

import org.springframework.stereotype.Component;

@Component
public class Dao {
    public void runDao(){
        System.out.println("hello world");
    }
}
java 复制代码
package com.fourth.anno;

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

@Component
public class Service {
    @Autowired
    private Dao dao;
    public void runService(){
        dao.runDao();
    }
}
java 复制代码
package com.fourth.anno;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean-anno.xml");
        Service service = context.getBean(Service.class);
        service.runService();
    }
}
XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <context:component-scan base-package="com.fourth.anno"></context:component-scan>
</beans>

(2)set 方法上自动装配

java 复制代码
package com.fourth.anno;

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

@Component
public class Service {    
    private Dao dao;

    @Autowired
    public void setDao(Dao dao){
        this.dao=dao;
    }

    public void runService(){
        dao.runDao();
    }
}

(3)构造方法上自动装配

java 复制代码
package com.fourth.anno;

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

@Component
public class Service {

    private Dao dao;
    @Autowired
    public Service(Dao dao) {
        this.dao = dao;
    }

    public void runService(){
        dao.runDao();
    }
}

(4)构造方法的形参上自动装配

java 复制代码
package com.fourth.anno;

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

@Component
public class Service {

    private Dao dao;

    public Service(@Autowired Dao dao) {
        this.dao = dao;
    }

    public void runService(){
        dao.runDao();
    }
}

(二)Resource 自动装配

(1)属性上自动装配

java 复制代码
package com.fourth.anno;

import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;

@Component
public class Service {
    @Resource
    private Dao dao;

    public void runService(){
        dao.runDao();
    }
}

(2)set 方法上自动装配

java 复制代码
package com.fourth.anno;

import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;

@Component
public class Service {

    private Dao dao;
    @Resource
    public void setDao(Dao dao) {
        this.dao = dao;
    }

    public void runService(){
        dao.runDao();
    }
}

Autowired 与 Resource 比较:

Autowired 可以应用在属性、set 方法、构造方法、构造方法的形参上;其默认通过类型进行装配。

Resource 可以应用在属性、set 方法上;其默认通过名称进行装配。

Autowired 基于 spring 框架;Resource 基于 java 扩展包,如果 JDK 版本高于11或低于8,应引入以下依赖:

复制代码
<dependency>
    <groupId>jakarta.annotation</groupId>
    <artifactId>jakarta.annotation-api</artifactId>
    <version>2.1.1</version>
</dependency>

(三)全注解开发

全注解开发,即使用配置类代替 xml 配置文件:

java 复制代码
package com.fourth.anno;

import org.springframework.stereotype.Component;

@Component
public class Dao {
    public void runDao(){
        System.out.println("hello world");
    }
}
java 复制代码
package com.fourth.anno;

import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;

@Component
public class Service {

    private Dao dao;
    @Resource
    public void setDao(Dao dao) {
        this.dao = dao;
    }

    public void runService(){
        dao.runDao();
    }
}
java 复制代码
package com.fourth.anno;

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

@Configuration
@ComponentScan(value = "com.fourth.anno")
public class SpringConfig {
}
java 复制代码
package com.fourth.anno;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        Service service = context.getBean(Service.class);
        service.runService();
    }
}
相关推荐
琹箐3 分钟前
ant-design4.xx实现数字输入框; 某些输入法数字需要连续输入两次才显示
前端·javascript·anti-design-vue
程序员-小李4 分钟前
VuePress完美整合Toast消息提示
前端·javascript·vue.js
风象南11 分钟前
SpringBoot的5种日志输出规范策略
java·spring boot·后端
咖啡啡不加糖18 分钟前
深入理解MySQL死锁:从原理、案例到解决方案
java·数据库·mysql
zimoyin20 分钟前
Compose Multiplatform 实现自定义的系统托盘,解决托盘乱码问题
java
啾啾Fun37 分钟前
【Java微服务组件】分布式协调P4-一文打通Redisson:从API实战到分布式锁核心源码剖析
java·redis·分布式·微服务·lua·redisson
Uyker1 小时前
从零开始制作小程序简单概述
前端·微信小程序·小程序
消失的旧时光-19431 小时前
Android USB 通信开发
android·java
惊鸿一博1 小时前
java_网络服务相关_gateway_nacos_feign区别联系
java·开发语言·gateway
花月C2 小时前
Mysql-定时删除数据库中的验证码
数据库·后端·mysql·spring