IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring 读取和存储对象 -> 正文阅读

[Java知识库]Spring 读取和存储对象

作者:1.2.2%C2%A0%40Service%EF%BC%88%E6%9C%8D%E5%8A%A1%E5%AD%98%E5%82%A8%EF%BC%89

目录

1. 存储Bean对象

?1.1 添加注解存储Bean对象到spring中

1.2 注解类?

1.2.1 @Controller(控制器存储)

1.2.2?@Service(服务存储)

1.2.3?@Repository(仓库储存)

1.2.4 @Component(组件存储)

1.2.5?@Congfiguration(配置存储)

?1.3 类注解的作用

1.4?@Bean注解的使用

1.4.1? Bean的重命名

2. 获取Bean对象

2.1 属性注入

2.2 构造方法注入

2.3 Setter注入?

2.4 三种注入方法的优缺点(MS)

2.5 另外一种注入关键字(@Resource)

2.5.1? @Resource属性注入

?2.5.2?@Resource构造方法注入

2.5.3?@Resource Setter 方法注入

?2.6??同?类型多个 @Bean 报错

2.6.1 使用@Resource(name="user1")

2.6.2 使用@Qualifier


1. 存储Bean对象

存储Bean之前,需要在spring-config.xml 中添加bean注册内容

?1.1 添加注解存储Bean对象到spring中

分为两种注解类型:

注解类:@Controller 、 @Service、@Repository、@Component、@Congfiguration

方法注解:@Bean

1.2 注解类?

1.2.1 @Controller(控制器存储)

@Controller
public class UserController {
    public void sayHi(String name) {
        System.out.println("你好," + name);
    }
}
import com.beans.*;
import com.model.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @program: spring-2
 * @description:
 * @author: DRY
 * @create: 2022-07-03 14:14
 **/
public class App {
    public static void main(String[] args) {
         1. 获取spring上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        2. 得到bean
        UserController userController = context.getBean(UserController.class);
        3. 使用bean
        userController.sayHi("张三");
    }
}

1.2.2?@Service(服务存储)

@Service
public class UserService {
    public void sayHi(String name) {
        System.out.println("你好," + name);
    }
}
class App {
 ? ?public static void main(String[] args) {
 ? ? ? ?// 1.得到 spring 上下?

        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2. 得到bean
        UserService userService = context.getBean("userService",UserService.class);
        //3. 使用bean
        userService.sayHi("张三");
 ? }
}

1.2.3?@Repository(仓库储存)

@Repository
public class UserRepository {
    public void sayHi(String name) {
        System.out.println("你好," + name);
    }
}
public class App {
    public static void main(String[] args) {
        // 1. 获取spring上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

         UserRepository userRepository = context.getBean("userRepository",UserRepository.class);
        userRepository.sayHi("张三");

    }
}

1.2.4 @Component(组件存储)

1.2.5?@Congfiguration(配置存储)

注意:

1. 即使在Spring中配置了bean 的扫描路径,但是5大类的注解不可以省略。

2. 即使加了5大类注解,但类没有放在spring配置的bean路径下,那么也是不能将类注入到spring中。?

?

@Controller 、@Service、@Repository、@Configuration 都是依靠@Component实现的。 即@Component使其他四个的父类。?

?1.3 类注解的作用

每个注解类都有不同的用途,使用不同的注解类,可以清楚地让程序源码明白这个类是在干什么,又什么用途。

?一般情况下,类注解的bean名称命名规则是小驼峰,将类名第一个字母小写。

Bean命名规则

? ? ? ? 如果第一个字母为大写,第二个字母为小写,那么Bean的命名规则就是首字母小写。

? ? ? ? 如果第一个字母和第二个字母都是大写,那么Bean的命名就是原类名。

@Controller
public class USController {
    public void sayHi(String name) {
        System.out.println("你好," + name);
    }
}

?

public class App {
    public static void main(String[] args) {
        // 1. 获取spring上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        USController usController = context.getBean("USController",USController.class);
        usController.sayHi("张三");


    }
}

1.4?@Bean注解的使用

@Component
public class UserBeans {
    //方法注解@Bean必须配合五大类注解才有效
    @Bean
//    @Bean(name = "getUser")    //相当于给对象重命名。用花括号可以方多个别名,重命名之后,就不能用方法名获取Bean,如果没有起别名,就可以用方法名获取Bean
    //@Bean(name = {"getUser"},{“userNa”})
    public User user1(){
        User user = new User();
        user.setId(1);
        user.setName("张三");
        user.setPassword("123");
        return user;
    }
}
public class User {
    private int id;
    private String name;
    private String password;

    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;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
public class App {
    public static void main(String[] args) {
        // 1. 获取spring上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        User user1 = context.getBean("user1", User.class); //第一个参数必须跟UserBeans方法名一样
        System.out.println(user1);
    }
}

?注意:

方法注解@Bean 必须要配合5大类注解一起使用才有效

?

1.4.1? Bean的重命名

第一种:

第二种:?

?

?当给@Bean重命名之后,那么就不能使用方法名来获取对象。

当@Bean重命名之后就不能使用方法名(User1)来获取Bean,如果没有对Bean进行重命名,那么可以使用方法名获取Bean。

2. 获取Bean对象

?获取bean对象叫做对象装配,即使把对象取出来放到某个类中,也叫对象注入

对象装配的实现方法有3种:

1. 属性注入

2. 构造方法注入

3. Setter注入

2.1 属性注入

属性注?是使? @Autowired 实现的,将 Service 类注?到 Controller 类中。
@Service
public class UserService {
    public void sayHi(String name) {
        System.out.println("你好," + name);
    }
    /**
     * 根据id获取用户
     * @param id
     * @return
     */
    public User getUserById(int id) {
        //伪代码,不用连接数据库
        User user = new User();
        user.setId(id);
        user.setName("李四");
        user.setPassword("aaaa");
        return user;
    }
}
@Controller
public class UserController {
    //1. 属性注入
    @Autowired
    public UserService userService;
    /**
     * 根据id获取用户
     * @param id
     * @return
     */
    public User getUserById(int id) {
        //伪代码
        return userService.getUserById(id);
    }
    public void sayHi(String name) {
        System.out.println("你好," + name);
    }
}

?

public class App {
    public static void main(String[] args) {
        // 1. 获取spring上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        UserController userController = context.getBean(UserController.class);
        System.out.println(userController.getUserById(10));
    }
}

2.2 构造方法注入

@Controller
public class UserController2 {
    public void sayHi(String name) {
        System.out.println("你好," + name);
    }
    
    private UserService userService;
//2. 构造方法注入
    @Autowired  //如果当前类只有一个构造方法,那么可以省略,有多个构造方法,不可以省略
    public UserController2(UserService userService) {
        this.userService = userService;
    }

    public User getUserById(int id) {
        //伪代码
        return userService.getUserById(id);
    }
}

2.3 Setter注入?

Setter 注?和属性的 Setter ?法实现类似,只不过在设置 set ?法的时候需要加上 @Autowired 注
解。
@Controller
public class UserController3 {
    public void sayHi(String name) {
        System.out.println("你好," + name);
    }
   
    private UserService userService;
 //3. Setter注入
    @Autowired 

       public void setUserService3(UserService userService) {
        this.userService = userService;
    }

    public User getUserById(int id) {
        //伪代码
        return userService.getUserById(id);
    }
}

注意:如果当前类只有一个构造方法,那么 @Autowired 可以省略,如果方法中有多个构造方法,@Autowired不可以省略。

2.4 三种注入方法的优缺点(MS)

💫 属性注入:优点是代码简洁,使用方便。缺点是只能用loC容器,如果是非loC容器不可用,并且只有在使用的时候才会出现空指针异常。

💫 构造方法注入:优点是通用性好,在调用对象之前,一定能保证该对象不为空。缺点是如果有多个参数来实现构造方法的初始化,会显得代码比较臃肿,此时就要考虑写的代码是否符合单一职责的设计模式了。(推荐使用)

💫 Setter:通用性不如构造方法。前期Spring推荐的版本。

2.5 另外一种注入关键字(@Resource)

2.5.1? @Resource属性注入

@Controller
public class UserController4 {
//属性注入
    @Resource
    private UserService userService;
    public User getUserById(int id) {
        //伪代码
        return userService.getUserById(id);
    }
}
public class App {
    public static void main(String[] args) {
        // 1. 获取spring上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserController4 userController4 = context.getBean(UserController4.class);
        System.out.println(userController4.getUserById(20));

    }
}

?2.5.2?@Resource构造方法注入

@Controller
public class UserController5 {

    private UserService userService;
//构造方法注入
    @Resource
    public UserController5(UserService userService){
        this.userService = userService;
    }
    public User getUserById(int id) {
        //伪代码
        return userService.getUserById(id);
    }
}

?可以看到,构造方法注入会报错。

2.5.3?@Resource Setter 方法注入

@Controller
public class UserController5 {

    private UserService userService;
//Setter 注入
    @Resource
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    public User getUserById(int id) {
        //伪代码
        return userService.getUserById(id);
    }
}
@ Autowired 和 @ Resource 区别(MS)

💫?1. 出身不同:@ Autowired来自Spring ,?@ Resource来自JDK的注解;

💫?2. 使用时设置的参数不同:相?于 @Autowired 注解来说,@Resource 注解?持更多的参数设置,例如 name 设置,根据名称获取 Bean。

💫?3.?@ Autowired 可用于属性注入、构造方法注入、Setter注入,而@ Resource关键字不能使用构造方法注解。

?2.6??同?类型多个 @Bean 报错

当一个类型被注册到Spring中多次时,程序运行会出现异常。

@Component
public class UserBeans2 {

    @Bean(name = "user1")
    public User user1(){
        User user = new User();
        user.setId(1);
        user.setName("张三");
        user.setPassword("123");
        return user;
    }
    @Bean(name = "user2")
    public User user2(){
        User user = new User();
        user.setId(2);
        user.setName("王五");
        user.setPassword("456");
        return user;
    }
}
@Controller
public class UserController6 {
    @Resource
    private User user;

    public User getUser() {
        return user;
    }
}

执行结果:非唯一的Bean对象。

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

💫?使? @Resource(name="user1") 定义。
💫?使? @Qualifier 注解定义名称。

2.6.1 使用@Resource(name="user1")

@Controller
public class UserController6 {
    @Resource(name = "user1")
    private User user;

    public User getUser() {
        return user;
    }
}

2.6.2 使用@Qualifier

@Controller
public class UserController7 {
    @Autowired
    @Qualifier(value = "user2")
    private User user;
    
    public User getUser() {
        return user;
    }
}
public class App {
    public static void main(String[] args) {
        // 1. 获取spring上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        UserController7 userController7 = context.getBean(UserController7.class);
        System.out.println(userController7.getUser());
    }
}

练习:

在 Spring 项?中,通过 main ?法获取到 Controller 类,调? Controller ??通过注?的?式调?Service 类,Service 再通过注?的?式获取到 Repository 类,Repository 类??有?个?法构建?个User 对象,返回给 main ?法。Repository ?需连接数据库,使?伪代码即可。
public class User {
    private int id;
    private String name;
    private String password;

    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;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
@Repository
public class UserRepository2 {
    public User getUser() {
        //伪代码
        User user = new User();
        user.setId(5);
        user.setName("王朱");
        user.setPassword("5555");
        return user;
    }
}
@Service
public class UserService2 {
    @Autowired
    private UserRepository2 repository2;
    public User getUser() {
        return repository2.getUser();
    }
}
@Controller
public class UserController8 {
    @Autowired
    private UserService2 userService2;

    public User getUser() {
        return userService2.getUser();
    }
}
public class App {
    public static void main(String[] args) {
        // 1. 获取spring上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        UserController8 userController8 = context.getBean(UserController8.class);
        System.out.println(userController8.getUser());
    }
}

?输出:User{id=5, name='王朱', password='5555'}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-07-05 23:25:28  更:2022-07-05 23:26:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 15:19:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码