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

目录

一 .使用注解实现对象储存在Spring框架

 1.类注解(5大类注解)

2.方法注解(@Bean)

 2.1 方法注解重命名bean

二.Spring更简单的获取对象 

1.属性注入 

2.构造方法注入

 3.setter注入

4.@Resource另一种注入方式

5.同一类型多个@Bean报错


一 .使用注解实现对象储存在Spring框架

想要将对象存储在Spring中,有两种注解类型可以实现:

  1. 类注解:
    @Controller
    @Service
    @Repository
    @Component
    @Configuration
  2. 方法注解:@Bean

这些类注解的功能是一样的.为什么需要这么类注解的原因是:
让程序员看到注解后,就能直接了解当前类的用途,比如:
@Conroller:表示的业务逻辑层
@Service:服务层
@Repository:持久层
@Configuration:配置层

程序的工程分层,调用流程如下:

 1.类注解(5大类注解)

注意事项:

1.读取存入对象的id:默认情况就是首字母小写

 2.关于储存目录

 Spring使用5大类注解生成beanName问题:

类名如果第一个和第一个都为大写就直接返回原类名.否则转化成小驼峰(将首字母转化成小写)的形式 

2.方法注解(@Bean)

首先创建一个类User

public class User {
    public int id;
    public String name;
    public int age;
	// ... 一堆 getter和setter
}

创建一个UserBean

package com.wwzz.util;

import com.wwzz.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class UserBean {
    @Bean
    public User user() {
        // 伪代码 获取数据库中的内容....
        User user = new User();
        user.setId(1);
        user.setName("张三");
        user.setAge(18);
        return user;
    }
}

测试这个注解读取到bean代码

 2.1 方法注解重命名bean

import com.wwzz.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class UserBean {
    @Bean(name = {"u1","u2"})
    public User user() {
        // 伪代码 获取数据库中的内容....
        User user = new User();
        user.setId(1);
        user.setName("张三");
        user.setAge(18);
        return user;
    }
}

注意事项 

1.Spring默认是类扫描,要想使用方法注解@Bean就需要搭配类注解(@Component)一起使用,才能将方法返回对象顺利储存到Spring中

2.重命名后,方法名就无法使用了 

二.Spring更简单的获取对象 

获取Bean对象也叫对象装配,是把对象取出来放到某个类中,有时候也叫对象注入,对象装配(对象注入)的实现方法一下3种.

  1. 属性注入
  2. 构造方法注入
  3. setter注入

1.属性注入 

2.构造方法注入

 如果当前类里面的构造方法只有一个,那么@Autowired是可以被省略的

 3.setter注入

 属性注入和构造方法注入及Setter注入的区别是啥??

  1. 属性注入特点写法简单,但是通用性不好,它只能运行在loc容器下,如果是非loc容器就会出现 问题
  2. Setter注入:早期Spring版本推荐写法,Setter注入通用性没有构造方法通用
  3. 构造方法注入:通用性更好,它能确保在使用注入对象之前,此注入对象一定初始化过,当构造方法注入参数过多时,此时开发 者就要检测自己所写的代码是否符合单一设计原则的规范,此注入的方式是Spring后期版本中推荐注入的方式

4.@Resource另一种注入方式

@Resource支持属性注入和Setter注入,但不支持构造方法注入

@Resource与@Autowired的区别

1.出生不同:@Resource来自于JDK(java),@Autowired是Spring框架提供的
2.用法不同:@Autowired支持属性注入,构造方法注入和Setter注入,而@Resource不支持构造方法注入
3.支持的参数不同:@Resource支持更多的参数设置,比如name,type等设置,而@Autowired只支持require参数设置.

5.同一类型多个@Bean报错

package com.wwzz.util;

import com.wwzz.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class UserBean {
    @Bean
    public User user1() {
        // 伪代码 获取数据库中的内容....
        User user = new User();
        user.setId(1);
        user.setName("张三");
        user.setAge(18);
        return user;
    }
    @Bean
    public User user2() {
        User user = new User();
        user.setId(2);
        user.setName("李四");
        user.setAge(20);
        return user;
    }
}

在另一个类中获取User对象

package com.wwzz.controller;

import com.wwzz.model.User;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class UserController5 {
    @Resource
    private User user;

    public User getUser() {
        return user;
    }
}

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        UserController5 userController5 = context.getBean("userController5",UserController5.class);
        User user = userController5.getUser();
        System.out.println(user);
    }

原因:获取Bean对象的方法,比如首先从名称获取,如果获取不到,就会从类型获取,上面的代码,从名称获取不到,类型又有多个,就会注入失败 

解决方法1:使用@Resource(name='别名')

解决方法2:使用@Qualifier注解定义名称

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值