浅谈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