> 文档中心 > Spring入门+IoC注解详情【依赖注入、整合Junit、配置类】---多以案例讲述

Spring入门+IoC注解详情【依赖注入、整合Junit、配置类】---多以案例讲述

目录

 

1.Spring 概述

2 . Ioc概述

3. 依赖注入

4. 依赖注入接口【通过注解加载配置类】【整合junit】

5.IoC详情【Bean创建】

6.基本注解归纳

7. 图集总结


1.Spring 概述

  • Spring是一站式框架,也就是Spring可以整合其他框架

    • Spring Ioc : 对象工厂及依赖注入

2 . Ioc概述

1)什么是Ioc?

  • Ioc是 Inversion Control 的缩写,即"控制反转"。

  • 控制反转:将创建对象的权力,由自己【new】,反转给Spring

    • 我们一般创建一个类对象都会使用new 关键字,new一个对象出来。

      而控制反转就是:不在new ,而是直接将实现类对象存入Ioc容器中,从容器中进行调用即可。

  • Ioc 容器 : 一个以键值对的形式保存实现类对象。通过键的名称,找、调用键对应的值[类]

    • key = 对类注解声明放入Ioc容器的name名称

    • value = 注解名称下的实现类对象

  • 图集详解

2)Ioc创建对象基础案例

  • 需求

    • 使用Ioc的方式创建UserService对象,并调用查询所有方法

2.1相关注解说明

@Component("xxx") //注解标明将该类取明为xxx,作为键存入Ioc容器中 @Configuration  //注解标明该类是一个配置类@ComponentScan(basePackages = "扫描需要被加载的类所在的包")

2.2图集导航【以User类为例】

  • UserService【接口】

    public interface UserService {    //接口类    void selectAll();}

  • UserServiceImpl【接口实现类】

  • 编写功能接口及其实现类。使用@Component将实现类添加到spring容器。

    @Component("userServiceImpl")  //存入Ioc容器中public class UserServiceImpl implements UserService {    //实现类    //查询所有    public void selectAll() {        System.out.println("demo01-userService-selectAll");    }}
  • Demo01Configuration【配置类】

  • 编写配置类,并扫描实现类。使用@Configuration声明配置类,使用@ComponentScan进行扫描

    @Configuration  //配置类@ComponentScan(basePackages = "com.czxy.demo01.service") //扫描需要被加载的类所在的包public class Demo01Configguration {  }

  • TestDemo01 【测试类。使用ApplicationContext从spring容器中获得实现类。】

    public class TestDemo01 {    //测试类    public static void main(String[] args) {        //通过处理注解,获得工厂        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo01Configguration.class);        //通过工厂,获得mapper        UserService userServiceImpl = (UserService) applicationContext.getBean("userServiceImpl");        //调用        userServiceImpl.selectAll();    }}
    • 测试结果

    2.3总结

  • • 配置类必须使用 @Configuration 进行声明

    • @ComponentScan 扫描路径必须是service的包名。

3. 依赖注入

3.1相关注解说明

@Ressource(name="xxx") //xxx表示对应Dao包下@Component("xxx")注解标明的类对象@Component("xxx") //注解标明将该类取明为xxx,作为键存入Ioc容器中 @Configuration  //注解标明该类是一个配置类@ComponentScan(basePackages = "扫描需要被加载的类所在的包")

3.2图集导航【已User类为例】

  • UserDao【数据访问层】

    • 编写UserDao,并使用@Component

@Component("userDao2")public class Userdao {    public void selectAll(){        System.out.println("dao : selectAll");    }}
  • UserService 【实现类】

    • 编写UserService,并使用@Component

@Component("userService2")public class UserServiceImpl implements UserService {     @Override    public void selectAll() {        //调用dao        userdao.selectAll();        System.out.println("service:selectAll");    }}

  • UserService 【实现类完善】【业务逻辑层】

    • 修改UserService,提供UserDao成员变量,并使用@Resource完成注入

    @Component("userService2")public class UserServiceImpl implements UserService {        //将userDao1注入给UserDao    //依赖注入    @Resource(name = "userDao2")     private Userdao userdao ;        @Override    public void selectAll() {        //调用dao        userdao.selectAll();        System.out.println("service:selectAll");    }}

  • Demo02Configuration【配置类】

    @Configuration  //标注配置类@ComponentScan(basePackages{"com.czxy.demo02.dao","com.czxy.demo02.service"}) //标注需要被加载的类所在的包进行扫描public class Demo02Configuration {}

  • TestDemo02 【测试类】【表示层】

    public class TestDemo02 {    public static void main(String[] args) {        //通过处理注解,获得工厂        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo02Configuration.class);        // //通过工厂,获得mapper        UserServiceImpl userService2 = applicationContext.getBean("userService2", UserServiceImpl.class);         //调用        userService2.selectAll();    }}

    • 测试结果

    3.3 图集总结

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【接口】

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注解呢?

    • 是为了更好的区分不同层,更好的体现三层架构模式

    • 在我们没有为他们赋予名称时,它会默认命名为 ---> 类名的首字母该小写