目录
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
命名规则:
- 当没有设置name属性时,bean默认的名称是方法名
- 设置了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;

















