spring3:更简单的读取和存入对象

目录

1.存储 Bean 对象

1.1 前置⼯作:配置扫描路径(重要)

1.2 添加注解存储 Bean 对象

1.2.1.@Controller[控制器]

1.2.2 @Service[服务]

1.2.3 @repoistory[仓库]

1.2.4 @Configuration[配置]

1.2.5 @Component[组件]

1.3为什么要这么多类注解?

1.3.1 类注解之间的关系

1.3.2 Bean 命名规则

1.4通过@Bean方法注解

1.使用

2.重命名Bean

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

2.1 3种注入方式

1. 属性注⼊

2. 构造⽅法注⼊

3. Setter 注⼊

4.三种注入方式优缺点分析

2.2 2种注入方法

1.@Autowired

2.@Resource

3.@Autowired 和 @Resource 的区别

3.@Bean把一个类型的对象注入多次的问题


1.存储 Bean 对象

1.1 前置⼯作:配置扫描路径(重要)

注意:想要将对象成功的存储到 Spring 中,我们需要配置⼀下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中。

在 spring-config.xml 添加如下配置

<?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.beans"></content:component-scan>
</beans>

1.2 添加注解存储 Bean 对象

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

1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration。

2. ⽅法注解:@Bean

使用五大类注解实现

注:1.加类注解

2.要放到配置文件的目录下

1.2.1.@Controller[控制器]

package com.beans;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
    public void sayHi(){
        System.out.println("UserController");
    }
}

1.2.2 @Service[服务]

@Repository
public class UserRepository {
    public void sayHi(){
        System.out.println("UserRepository");
    }
}

1.2.3 @repoistory[仓库]

@Repository
public class UserRepository {
    public void sayHi(){
        System.out.println("UserRepository");
    }
}

1.2.4 @Configuration[配置]

@Configuration
public class UserConfig {
    public void sayHi(){
        System.out.println("UserConfig");
    }
}

1.2.5 @Component[组件]

@Component
public class UserComponent {
    public void sayHi(){
        System.out.println("UserComponent");
    }
}

1.3为什么要这么多类注解?

提高代码可读性,可以判断当前类的用途

@Component

@Configuration:配置层

@Controller:控制层(前端参数校验)

@Service:服务器(数据的组装和接口调用)

@Repository:持久层(负责和数据库交互)

1.3.1 类注解之间的关系

 其实这些注解⾥⾯都有⼀个注解 @Component,说明它们本身就是属于 @Component 的“⼦类”

1.3.2 Bean 命名规则

第一个大写,第二个小写,返回时第一个改为小写

第一二个都是大写,则返回原类名

1.4通过@Bean方法注解

1.使用

必须搭配类注解使用.命名是方法的名称

@Component
public class UserBean {
    @Bean
    public User user1(){
        User user=new User();
        user.setUserId(1);
        user.setUsername("zhang");
        return user;
    }
}
public class APP {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
         User user=context.getBean("user1",User.class);
        System.out.println(user);
}
}

2.重命名Bean

命名规则:

  1. 当没有设置name属性时,bean默认的名称是方法名
  2. 设置了name属性时,通过重命名的name属性对应的值来获取

设置name属性给Bean对象命名可以取多个名字

@Component
public class UserBean {
    @Bean(name = {"userinfo","user1"})
    public User user1(){
        User user=new User();
        user.setUserId(1);
        user.setUsername("zhang");
        return user;
    }
}

 名字要对应

 

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

获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊。

2.1 3种注入方式

1. 属性注⼊

属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。

 

 

 

2. 构造⽅法注⼊

要加构造方法

@Service
public class UserService {
    public  void sayHi(){
        System.out.println("UserService");
    }
}
@Controller
public class UserController2 {
    private UserService userService;
    public UserController2(UserService userService){
        this.userService=userService;
    }

    public void sayHi(){
        userService.sayHi();
    }
}

3. Setter 注⼊

Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注

@Service
public class UserService {
    public  void sayHi(){
        System.out.println("UserService");
    }
}
public class UserController4 {
    private UserService userService;
    @Autowired
    public void setUserService(UserService userService){
        this.userService=userService;
    }
    public void sayHi(){
        userService.sayHi();
    }
}

4.三种注入方式优缺点分析

  • 属性注入:
    • 优点:简洁使用方便
    • 缺点:只能用ioc容器,也可能出现空指针异常
  • 构造方法注入:Spring推荐的注入方式
    • 缺点:如果有多个注⼊会显得⽐较臃肿
    • 优点:通用性,保证注入不为空
  • setter注入:Spring早期推荐方式
    • 缺点:通用性不如构造方法

2.2 2种注入方法

1.@Autowired

@Controller
public class UserController3 {
    private UserService userService;
    @Autowired
    public void setUserService(UserService userService){
        this.userService=userService;
    }
    public void sayHi(){
        userService.sayHi();
    }
}

2.@Resource

@Controller
public class UserController3 {
    private UserService userService;
    @Resource
    public void setUserService(UserService userService){
        this.userService=userService;
    }
    public void sayHi(){
        userService.sayHi();
    }
}

3.@Autowired 和 @Resource 的区别

1.出身不同:@Autowired来自于Spring,@Resource来自于JDK注解

2.用法不同:@Autowired可以用于三种注入方式,@Resource不能用于构造函数注入

3.参数不同:@Autowired只支持requierd设置,@Resourcd可以设置更多的参数,例如name设置根据名称获取 Bean;type设置

3.@Bean把一个类型的对象注入多次的问题

 方法:

1.精确描述bean名称

2.使用@Resouce设置name方式来重命名注入对象

@Resource(name="user")

3.用@Autowired+@Qualifier来筛选bean对象

@Autowired
@Qualifier(value="user1")
private User user;

猜你喜欢

转载自blog.csdn.net/qq_53190275/article/details/130457528