【JAVAEE系列之Spring】003创建与使用Bean

Bean常常用于配置相关信息,或者用于依赖注入,防止硬编码,更好地单元测试。

Bean的管理都是Spring来做的,当需要Bean对象的时候,Spring拦截掉你的请求,将已有的Bean对象返回给你,而不是去创建一个新对象,这样就控制了Bean对象的生命周期。

【使用@Bean创建Bean】

我们试着创建一个配置类,返回我们想要的数据库连接源DataSource:

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new     DriverManagerDataSource();

    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/db1");
    dataSource.setUsername("root");
    dataSource.setPassword("123");
    return dataSource;
}

首先,创建了一个dataSource,然后配置了连接字符串,className,用户名密码等信息。

默认情况下,这个Bean的名称和方法名一致,可以通过name参数修改:

@Bean(name="theSource")
public DataSource dataSource() {
...

也可以设置生命周期:

@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public DataSource dataSource() {
...

【使用@Component创建Bean】

@Bean常常用于配置类,@Component范围更广。

我们在com.springapp.services包下创建一个Bean:

@Component
public
class UserService { public int findNumberOfUsers() { return 10; } }

这个Bean就是一个基础的方法,返回用户的数量,我们先不涉及到数据库,以依赖注入为重。

如何让spring知道我们有这个Bean的存在呢?

扫描二维码关注公众号,回复: 6964585 查看本文章

加入包扫描:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.springcookbook.controller", "com.springcookbook.service"})
public class AppConfig {

}

同样,我们也可以为其设置名称:

@Component('anAmazingUserService')
public class UserService {

}

@Controller常常用于控制器类

@Service用于服务类、业务逻辑类

@Repository用于持久化类

【使用Bean】

1. 使用AutoWired注入Bean:

@Autowired
UserService userService;

2.使用Bean对象

@Controller
public class HelloController {

  @Autowired
  UserService userService;

  @RequestMapping("/hello")
  @ResponseBody
  public String hi() {
    return "Hello from Maven project!" + "There are " + userService.getUserNums() +"users.";
  }
}

3. 效果

【手动注入Bean】

1. 引入ApplicationContext

@Autowired
private ApplicationContext applicationContext;

2. 使用ApplicationContext根据名称获取对象

UserService userService = (UserService)applicationContext.getBean("userService");

【拆分配置文件】

1. 创建配置文件类

@Configuration
public class DatabaseConfig {
…

2. 将配置类注册到ServletInitializer

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[]{AppConfig.class, DatabaseConfig.class};
}

猜你喜欢

转载自www.cnblogs.com/dayAndnight2019/p/11309875.html
今日推荐