Bean常常用于配置相关信息,或者用于依赖注入,防止硬编码,更好地单元测试。
Bean的管理都是Spring来做的,当需要Bean对象的时候,Spring拦截掉你的请求,将已有的Bean对象返回给你,而不是去创建一个新对象,这样就控制了Bean对象的生命周期。
【使用@Bean创建Bean】
我们试着创建一个配置类,返回我们想要的数据库连接源DataSource:
@Beanpublic 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的存在呢?
加入包扫描:
@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:
@AutowiredUserService 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
@Autowiredprivate ApplicationContext applicationContext;
2. 使用ApplicationContext根据名称获取对象
UserService userService = (UserService)applicationContext.getBean("userService");
【拆分配置文件】
1. 创建配置文件类
@Configurationpublic class DatabaseConfig {…
2. 将配置类注册到ServletInitializer
@Overrideprotected Class [] getServletConfigClasses() { return new Class []{AppConfig.class, DatabaseConfig.class};}