浅谈Spring装载Bean的几种方式

2022-05-05 11:42:45 浏览数 (1)

浅谈Spring装载Bean的几种方式

装载Bean的几种注解

注解

使用位置

@Configuration

类,搭配@Bean标注方法体

@Repository

@Component

@Service

@Controller

@Configuration @Bean

@Configuration:配置,声明为Spring的配置类。早期的Spring是通过xml来配置Bean的,在Spring3时引入了@Configuration来代替xml进行配置Bean,相当于xml中的<Beans></Beans>。这是一个很重要的引进,毕竟我们是搞java的,写起Java来还是要比写xml舒服的多。 @Bean:此注解标注在方法上,用于表示方法的实例化、配置和初始化都是要交由Spring IOC管理的一个Bean ,相当于xml中的<Bean></Bean>。

示例:

1.声明一个User类:

代码语言:javascript复制
 @Data
 public class User implements Serializable {
     private int id;
     private String name;
     public User(){}
     public User(int id,String name){
         this.id = id;
         this.name = name;
     }
 }

2.声明一个Bean:

代码语言:javascript复制
 @Configuration
 public class UserConfig {
     @Bean
     public User user(){
         return new User(22,"zzxkj");
     }
 }

3.测试类:

代码语言:javascript复制
 @SpringBootTest
 public class ConfigTest {
     @Autowired
     private User user;
     @Test
     public void test(){
         System.out.println(user.toString());
     }
 }

4.结果如下:

在上述例子中,UserConfig类上加入@Configuration注解,表明这是一个配置类,里面有一个@Bean注解的user()方法,表明这个方法是交由Spring管理的Bean。而且若未指定Bean的名称,则默认该Bean的名称为方法名,这里指代user。

@Repository

从Spring2.0开始,为了简化Spring的开发,陆续引进了一些注解,而@Repository注解就属于最早引入的一批。@Repository用于标注数据访问层,也就是我们学JDBC时所说的DAO层,并支持自动处理数据库操作产生的异常,支持数据库操作异常处理这是@Repository的特殊之处,源码中也做出了相应介绍。

上述源码的大致意思就是,@Repository支持自动处理数据库操作产生的异常(DataAccessException)。

示例:

代码语言:javascript复制
 @Repository
 public class UserRepository{
     @Autowired
        //JdbcTemplate是Spring封装好的JDBC框架
     private JdbcTemplate jdbcTemplate;
     public Map<String, Object> findUserById(int id){
     String sql = "select *from users where id = ?";
         return jdbcTemplate.queryForMap(sql,id);
     }
 }

学过Mybatis的同学该说了,我好像在Dao层看到的是@Mapper注解啊,这里说明一下@Mapper是Mybatis的注解,而@Response是Spring的注解.

而且在idea中如果单单只使用@Mapper注解的话,我们在使 用Bean的时候是会飘红的,如下图所示:

提示,找不到该类型的Bean:

其实这里飘红的原因就是我上面所说的@Mapper是Mybatis的注解,该组件虽然被声明为Bean,但是并未被扫描管理到,只有在使用时才会被Spring扫描并管理。也就是说这里虽然爆红,但是并不影响我们的使用,不过这里飘红终究看着不舒服,解决方法有两种。

第一种:告诉Spring这个Bean不是必须存在的

第二种:在Dao层添加@Repository注解,声明为Spring管理的Bean

不过从Spring2.5开始,又引进了@Component,@Service,@Controller,而@Repository也添加上了我们即将要说的@Component注解。@Component是一个通用的Spring容器管理的单例bean组件,上述几个注解几乎都可以看到@Component的身影。 而@Repository, @Service, @Controller就是针对不同的使用场景所采取的特定功能化的注解组件。

@Component

@Component是一个通用注解,表明这个类会作为一个组件类,并告知Spring为这个类创建Bean。

示例:

测试类:

结果:

@Service

注解声明为业务处理(服务)类,注意DAO层和Service层的区别,DAO层面向sql表,Service层面向业务。可以简单的理解为Service是对DAO的再次封装,并对外提供相应的服务接口。

示例:

上述代码中的UserRepository,就是对应的DAO。

@Controller

声明此类是一个SpringMVC Controller对象,也就是控制器。

示例:

这里会返回一个由模板引擎解析过的index视图,这里我使用的是Thymeleaf,默认的模板解析路径地址在resources>templates,当然可以自定义合适的地址。

返回的视图:

continue

0 人点赞