注解dao为持久层
注解service为业务层
下面的变量也要用@Autowired 注解注释起来
bean.xml这个配置文件还是存在
创建一个SpringConfiguration文件,作用于beal.xml一样
spring的新注解,Configuration 作用:指定当前类是一个配置类,
ComponentScan 作用:用于注解指定spring在创建容器时,要扫描的包
属性value 它和basePackages的作用是一样的,都是用于指定创建容器要扫描的包
我们使用此注解等同于xml配置了
<context:component-scan base-package="com.itheima"></context:component-scan>
public QueryRunner createQueryRunner(DataSource dataSource){
return new QueryRunner(dataSource);
}
用于创建一个queryrunner对象。前面加上@Bean 就会自动添加到Spring容器中。
作用:把当前方法的返回值作为bean对象存入spring的ioc容器中
属性name:指定bean的id,默认值是方法的名称
@Bean("dataSource")
public DataSource createDataSource(){
try{
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/eesy?serverTimezone=GMT%2B8&characterEncoding=utf-8");
ds.setUser("root");
ds.setPassword("password");
return ds;
}catch (Exception e){
throw new RuntimeException(e);
}
}
细节:当我们使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象
查找的方式和Autowired注解的作用是一样的
还可以用@Scope 对配置类的方法进行注解,变成多例模式
细节:configuration注解中,当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写
自我总结
程序的运行是Test文件
test文件中,调用了findAllAccount这个方法
这个方法是IAccountService接口定义的方法
这个实体类业务层,又是通过持久层调用的数据
最后在AccountDaoImpl这个实现类中的方法
这个方法运用到了runner这个对象,
runner对象是在config文件夹下的配置类
需要用@Configuration注解表明他是一个配置类
在配置类中的方法前面加上@Bean 就会自动添加到Spring容器中。
作用:把当前方法的返回值作为bean对象存入spring的ioc容器中
属性name:指定bean的id,默认值是方法的名称
import用于导入其他的配置类
属性value 用于指定其他类的字节码
当我们使用import注解后,有import注解的类,就是主配置类
propertysource
用于指定properties文件的位置,属性value指定文件的名称和路径
关键字:classpath,表示类路径下
分析
应用程序入口 main方法
junit单元测试中,没有main方法,也能执行
junit集成了一个main方法
该方法就会判断当前测试类中哪些方法有@Test注解
junit就会让有test注解的方法执行,
junit不会管我们是否采用spring框架
在执行测试方式时,junit根本不知道我们是不是使用了spring框架
所以也就为我们读取配置文件或者配置类创建核心容器
由以上可知,当测试方法执行,没有ioc容器,就算写了autowired注解,也无法实现注入
spring整合junit的配置
导入spring整合junit 的jar包
使用junit提供的注解,把原有的main方法替换了,替换成spring提供的
@Runwith
告知spring的运行器,spring和ioc创建是基于xml还是注解的并且说明位置
@ContextConfiguration
Locations: 指定xml文件位置,加上classpath关键字,表示在类路径下
classess:指定注解类所在位置
当我们使用spring 5.x版本,要求junit版本jar版本必须4.1.1以上