4. 依赖注入接口【通过注解加载配置类】【整合junit】
4.1 相关注解说明
@RunWith(SpringRunner.class) //spring 整合Junit ,告诉这个类是一个spring的测试类 @ContextConfiguration(classes = 配置类类名.class) //加载配置类 @Ressource(name="xxx") //xxx表示对应Dao包下@Component("xxx")注解标明的类对象 @Component("xxx") //注解标明将该类取明为xxx,作为键存入Ioc容器中 @Configuration //注解标明该类是一个配置类 @ComponentScan(basePackages = "扫描需要被加载的类所在的包")
4.2 图集导航
- UserDao【接口】
1.public interface UserDao3 { void selectAll(); }
UserDaoImpl【Dao接口实现类】【数据访问层】
@Component("userDao3") //把一个类添加到Component容器中 public class UserdaoImpl3 implements UserDao3 { @Override public void selectAll() { System.out.println("userDao3接口 : selectAll"); } }
UserService 【接口】【业务逻辑层】
public interface UserService3 { void selectAll(); }
- UserServiceImpl 【Service接口实现类】
//实现类 @Component("userService3") public class UserServiceImpl3 implements UserService3 { @Resource(name = "userDao3") //依赖注入 private UserDao3 userDao3 ; @Override public void selectAll() { userDao3.selectAll(); System.out.println("userService3 : selectAll"); } }
Demo03Configuration【配置类】
@Configuration //配置类 @ComponentScan(basePackages = {"com.czxy.demo03"}) //所需要扫描的包 public class Demo03Configuration { }
- TestDemo03 【测试类】【表示层】
@RunWith(SpringRunner.class) //spring 整合Junit ,告诉这个类是一个spring的测试类 @ContextConfiguration(classes = Demo03Configuration.class) //加载配置类 public class TestDemo03 { @Resource(name = "userService3") //依赖注入 private UserService3 userService3; @Test public void testDemo03(){ userService3.selectAll(); } }
测试结果
4.3图集总结
5.IoC详情【Bean创建】
5.1 相关注解说明
Bean相关注解 @Component :将修饰的资源交予spring管理。 value属性:为资源命名(唯一标识) @Controller :衍生注解,与@Component作用和属性相同。特用于修饰表示层的资源。web层(Servlet层) @Service :衍生注解,与@Component作用和属性相同。特用于修饰业务逻辑层的资源。(Service层) @Repository :衍生注解,与@Component作用和属性相同。特用于修饰数据访问层的资源。 (dao层)
5.2 图集导航 【以Student为例】
StudentDao 【dao接口】
public interface StudentDao { //查询所有 void selectAll(); }
StudentdaoImpl 【dao接口实现类】
@Repository("studentDao4") public class StudentDaoImpl implements StudentDao { @Override public void selectAll() { System.out.println("studentDao4 : selectAll"); } }
- StudentService 【service接口】
public interface StudentService { void selectAll(); }
StudentServiceImpl 【service接口实现类】
//将该类放入Ioc容器中,key : 注解名 value: 该StudentServiceImpl类 @Service("studentService4") public class StudentServiceImpl implements StudentService { //依赖注入 studentDao4 = Dao包中放入Ioc中 类的键key[标注注解的名] @Resource(name = "studentDao4") private StudentDao studentDao; @Override public void selectAll() { studentDao.selectAll(); System.out.println("studentService4 : selectAll"); } }
StudentServlet 【servle实现类】
@Controller("studentController") public class StudentServlet { //依赖注入service @Resource(name = "studentService4") private StudentService studentService ; public void selectAll(){ studentService.selectAll(); System.out.println("studentController : selectAll"); } }
Demo04Configuration 【配置类】
@Configuration //标注这个一个配置类 @ComponentScan(basePackages = {"com.czxy.demo4_Ioc"}) //标注放入要扫描的包的路径 public class Demo04Configuration { }
Test04_Student 【测试类】
@RunWith(SpringRunner.class) //标注这是这个spring测试类 @ContextConfiguration(classes = Demo04Configuration.class) //加载配置类 public class Test04_Student { @Resource(name = "studentController") private StudentServlet studentServlet; @Test public void run(){ studentServlet.selectAll(); } }
- 测试结果
5.3图集总结
6.基本注解归纳
@RunWith(SpringRunner.class) //spring 整合Junit ,告诉这个类是一个spring的测试类 @ContextConfiguration(classes = 配置类类名.class) //加载配置类 @Ressource(name="xxx") //xxx表示对应Dao包下@Component("xxx")注解标明的类对象 @Component("xxx") //注解标明将该类取明为xxx,作为键存入Ioc容器中 @Configuration //注解标明该类是一个配置类 @ComponentScan(basePackages = "扫描需要被加载的类所在的包") Bean相关注解 @Component :将修饰的资源交予spring管理。 value属性:为资源命名(唯一标识) @Controller :衍生注解,与@Component作用和属性相同。特用于修饰表示层的资源。web层(Servlet层) @Service :衍生注解,与@Component作用和属性相同。特用于修饰业务逻辑层的资源。(Service层) @Repository :衍生注解,与@Component作用和属性相同。特用于修饰数据访问层的资源。 (dao层)
7. 图集总结
类对象都可以通过@Component() 注解加入IoC容器,但是为什么又要用@Controller、@Service、@Repository注解呢?
是为了更好的区分不同层,更好的体现三层架构模式
在我们没有为他们赋予名称时,它会默认命名为 ---> 类名的首字母该小写