Spring更简单的读取和存储对象

本文介绍了Spring框架中如何通过注解替代XML配置来管理Bean,包括@Component及其子注解@Controller、@Service、@Repository、@Configuration的使用,以及方法注解@Bean。文章还讨论了Bean的命名规则,展示了属性、构造方法和Setter注入的示例,并提到了@Autowired与@Resource的区别以及处理多个相同类型Bean的策略。
摘要由CSDN通过智能技术生成

1.存储对象

通过注解来替代配置,依然需要配置扫描包的类对象

1.配置扫描路径
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="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
https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package="com.bean">
    </content:component-scan>
    <!--    <bean id="user" class="com.bit.beans.User"></bean>-->
</beans>

注册扫描的包

<content:component-scan base-package="com.bean">
    </content:component-scan>
2.添加注解存储Bean对象

有两种注解类型可以实现:

  1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration。
  2. ⽅法注解:@Bean。
package com.bean;

import org.springframework.stereotype.Controller;

/**
 * Created by 伦敦看日出
 * Description:通过@Controller注解将对象存储到Spring中
 * User: yyt
 * Date: 2023-04-22
 * Time: 15:22
 */
@Controller
public class User {
    public String sayHi(String name) {
        return name + ": spring-bean";
    }
}

启动类App

import com.bean.User;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

public class App {
    public static void main(String[] args) {
        // 1.获取Spring上下文对象,指定Spring的配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.加载某个bean
        User user = (User) context.getBean("user");
        // 3.调用相应的方法
        System.out.println(user.sayHi("Java"));
    }
}
3.为什么要这么多注解

让程序员看到类注解可以直接了解当前类的用途

⽐如:

  • @Controller:表示的是业务逻辑层;
  • @Servie:服务层;
  • @Repository:持久层;
  • @Configuration:配置层。

在这里插入图片描述

@Controller / @Service / @Repository / @Configuration 等注解是 @Component 的“⼦类”

4.注意Bean的命名

bean一般都是使用大驼峰命名,读取的时候首字母小写,但是遇到前两个字母都大写的时候就不能将首字母小写,而是要将两字母都大写。

在这里插入图片描述

5.方法注解

@Bean方法注解是添加到方法上,需要搭配类注解一起使用

A. 创建User对象

package com.bean;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;

public class User {
    private int id;
    private String name;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

B. 添加注解

package com.bean;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;

@Controller
public class Users {
    @Bean
    public User user1() {
        User user = new User();
        user.setId(1);
        user.setName("Bean");
        return user;
    }
}

C. 获取bean对象中的user1

import com.bean.User;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

public class App {
    public static void main(String[] args) {
        // 1.获取Spring上下文对象,指定Spring的配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.加载某个bean
        User user = (User) context.getBean("user1");
        // 3.调用相应的方法
        System.out.println(user.toString());
    }

}

在这里插入图片描述

6.重命名Bean
@Bean(name = {"u1","u2"})
@Bean({"u1","u2"}) // name= 可以省略

2.获取Bean对象(对象装配)

对象装配(对象注⼊)的实现⽅法以下 3 种

  1. 属性注⼊
  2. 构造⽅法注⼊
  3. Setter 注⼊
1.属性注⼊
属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。

Service 类代码:

package com.bean.service;

import com.bean.User;
import org.springframework.stereotype.Service;

import javax.xml.ws.ServiceMode;

@Service
public class UserService {
    public User getUser(int id) {
        User user = new User();
        user.setId(1);
        user.setName("spring");
        return user;
    }
}

Controller 类代码:

package com.bean.Controller;

import com.bean.User;
import com.bean.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    // 注入方法1:属性注入
    @Autowired
    private UserService service;
    public User getUser(int id) {
        return service.getUser(id);
    }
}

获取 Controller中的getUser方法:

package com.bean;

import com.bean.Controller.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ControllerTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserController userController = context.getBean(UserController.class);
        System.out.println(userController.getUser(1).toString());
    }
}

输出:

User{id=1, name=‘Bean’}

2.构造方法注入(推荐)
@Controller
public class UserController2 {
    private UserService userService;
    @Autowired
    public UserController2(UserService userService) {
        this.userService = userService;
    }
    public User getUser(int id) {
        return userService.getUser(id);
    }
}
3.Setter注入
@Controller
public class UserController3 {
    private UserService userService;
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    public User getUser(int id) {
        return userService.getUser(id);
    }
}
4.@Autowired 和 @Resource 的区别
  • 出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
  • 使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如 name 设置,根据名称获取 Bean。
  • 修饰对象不同,@Autowired用于属性注入
5.同一类型多个@Bean报错

解决同⼀个类型,多个 bean 的解决⽅案有以下两个:

  • 使⽤ @Resource(name=“user1”) 定义。
  • 使⽤ @Qualifier 注解定义名称。

@Autowired 和 @Resource 的区别

  • 出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
  • 使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如 name 设置,根据名称获取 Bean。
  • 修饰对象不同,@Autowired用于属性注入
5.同一类型多个@Bean报错

解决同⼀个类型,多个 bean 的解决⽅案有以下两个:

  • 使⽤ @Resource(name=“user1”) 定义。
  • 使⽤ @Qualifier 注解定义名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伦敦看日出

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值