Spring IoC 容器配置(全注解方式 )

去除applicationContext.xml实现简单的spring,把bean交给spring容器管理,获取属性的注入

定义一个配置类:

@Configuration

用于指定当前类是一个 spring 配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext(有@Configuration 注解的类.class)。

@ComponentScan

用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的:<context:component-scan base-package="com.itheima"/>是一样的。

@Configuration
@ComponentScan(basePackages = "com.zl.spring") //类似于xml中<context:component-scan> 扫描注解
//加载多个文件//@ComponentScan(basePackages = {"",""})
@Import(JdbcConfig.class) //导入其他配置类
public class SpringConfiguration {

}

@Import

 用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration 注解。当然,写上也没问题

@PropertySource

 用于加载.properties 文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置。

@Bean

 该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。把这个方法的返回的对象添加到Spring容器

//可写可不写,提高可读性
@Configuration
@PropertySource("classpath:db.properties") //加载properties中的文件,classpath: 类路径
public class JdbcConfig {
    @Value("${jdbc.driverClassName}")
    private String driverClass;
    @Value("${jdbc.url}")
    private String jdbcUrl;
    @Value("${jdbc.user}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    //给连接池的数据源:  c3p0 赋四大参数
    @Bean("dataSource")
    public DataSource createDataSource() {
        ComboPooledDataSource ds = new ComboPooledDataSource();
        try {
            ds.setDriverClass(driverClass);
            ds.setJdbcUrl(jdbcUrl);
            ds.setUser(username);
            ds.setPassword(password);
        } catch (PropertyVetoException e) {
            e.printStackTrace();
            return null;
        }
        return ds;
    }
    //给Dbutils工具类,注入添加数据源
    @Bean("queryRunner")
    @Scope("prototype") //设置为多例
    public QueryRunner createQueryRunner(@Qualifier("dataSource") DataSource ds) { //获取制定数据源,每次都拿同一个数据源
        return new QueryRunner(ds);
    }
}

userDaoImpl同样的获取方式:

@Repository("userDao")
public class UserDaoImpl implements IUserDao {
    @Autowired  //根据类型   推荐使用
    @Qualifier("queryRunner") //根据id
    private QueryRunner runner;

userServiceImpl同样的获取方式:

@Service("userService")
public class UserServiceImpl implements IUserService {
    //使用@Resource 注解实现注入 ,不写name按类型
    @Resource(name="userDao")
    private IUserDao userDao;

测试类:使用  AnnotationConfigApplicationContext 获取 ApplicationContext 对象

private IUserService userService;
    @Before
    public void setUp() throws Exception {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);
         userService = applicationContext.getBean(IUserService.class);
    }

相关推荐