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

目录

1.1配置扫描路径

1.2添加注解存储Bean对象

1.2.1@Controller(控制器存储)

1.2.2@Service(服务存储)

1.2.3 @Repository(仓库存储)

1.2.4 @Component(组件存储) 

1.2.5 @Configuration(配置存储)

1.3 JavaEE标准分层 

1.4 Bean命名规则

1.5 方法注解 @Bean

1.5.1 @Bean的重命名

1.6 获取 Bean 对象

1.6.1 实现方法

1.6.2 属性注入

1.6.3 构造方法注入

1.6.4 Setter注入 

1.6.5  三种注入方法的区别


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

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

1.1配置扫描路径

 即使添加了注解,如果不是在配置的扫描包下的类对象,也是不能被存储到 Spring 中的。

1.2添加注解存储Bean对象

  • 类注解:@Controller  @Service  @Repository  @Component   @Configuration
  • 方法注解:@Bean

1.2.1@Controller(控制器存储)

@Controller
public class UserController2 {
    public void sayHi(){
        System.out.println("sayHi()");
    }

 1.2.2@Service(服务存储)

@Service
public class UserController2 {
    public void sayHi(){
        System.out.println("sayHi()");
    }

1.2.3 @Repository(仓库存储)

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

1.2.4 @Component(组件存储) 

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

1.2.5 @Configuration(配置存储)

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

 Main方法: 

 ApplicationContext context=
                new ClassPathXmlApplicationContext("spring-config.xml");

        UserController2 userController2=context.getBean("userController2",UserController2.class);
        userController2.sayHi();

执行结果: 

当前对象无法存储到spring:

 1.五大注解不在component-scan下

 2.在component-scan下但没有加五大注解

1.3 JavaEE标准分层 

1.4 Bean命名规则

默认情况下是小驼峰(首字母小写),如果类名首字母和第二个字母都为大写,Bean名称为原类名。

1.5 方法注解 @Bean

 @Bean
    public User user1(){
        User user1=new User();
        user1.setUid(2);
        user1.setUsername("lisi");
        user1.setAge(18);
        return user1;
    }

  

但是会报错:

 报错原因:

1.@Bean命名规则,默认情况下,@Bean存储对象的名称=方法名

2.@Bean注解必须配合五大注解使用

1.5.1 @Bean的重命名

 @Bean(name = {"user1","u1"})
    public User user1(){
        User user1=new User();
        user1.setUid(2);
        user1.setUsername("lisi");
        user1.setAge(18);
        return user1;
    }

注意事项:当给@Bean重命名后,默认的使用方法名获取对象的方式就不能用了

1.6 获取 Bean 对象

获取Bean对象也叫对象装配,是把对象取出来放在某个类中,也叫对象注入

1.6.1 实现方法

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

1.6.2 属性注入

Service 类的实现代码如下: 

@Service
public class UserService {
    public void init(){
        System.out.println("do UserService");
    }
}

 Controller 类的实现代码如下:

@Controller
public class UserController2 {

@Autowired
    private UserService userService;
    public void printUser2(){
        userService.init();
    }
}

获取Controller类中的printUser2()方法:

public class APP {
    public static void main(String[] args) {
  ApplicationContext context=
                new ClassPathXmlApplicationContext("spring-config.xml");

        UserController2 userController2=context.getBean("userController2",UserController2.class);
        userController2.printUser2();
  }
}

执行结果:

1.6.3 构造方法注入

 Controller 类的实现代码如下:

@Controller
public class UserController2 {
 private UserService userService;
// @Autowired
    public UserController2(UserService userService){
        this.userService=userService;
    }
    public void printUser2(){
        userService.init();
    }
}

 获取Controller类中的printUser2()方法:

public class APP {
    public static void main(String[] args) {
  ApplicationContext context=
                new ClassPathXmlApplicationContext("spring-config.xml");

        UserController2 userController2=context.getBean("userController2",UserController2.class);
        userController2.printUser2();
  }
}

执行结果:

注意事项:

如果是只有一个构造方法,可以不写@Autowired,如果有多个构造方法则需要加上@Autowired表明使用哪个构造方法

1.6.4 Setter注入 

 Controller 类的实现代码如下: 

@Controller
public class UserController2 {
 private UserService userService;
    @Autowired
    public void setUserService(UserService userService){
        this.userService=userService;
    }
    public void printUser2(){
        userService.init();
    }
}

  获取Controller类中的printUser2()方法:

public class APP {
    public static void main(String[] args) {
  ApplicationContext context=
                new ClassPathXmlApplicationContext("spring-config.xml");

        UserController2 userController2=context.getBean("userController2",UserController2.class);
        userController2.printUser2();
  }
}

执行结果:

注意事项:

Setter注入的 @Autowired不能省略,不然会报空指针异常

1.6.5  三种注入方法的区别

在构造方法中可以注入一个不可变对象,而Setter注入和属性注入不能注入一个不可变对象,为什么呢?

理由:在Java中,被final修饰的对象要满足以下任意一个条件

1. 被final修饰的对象需要直接赋值

2.被final修饰的对象需要在构造方法中赋值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

发呆的百香果子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值