Junit测试工具、IOC注入方式、常用注解、注入复杂属性等

1、Junit测试工具

  1. 什么是Junit

    JUnit是一个Java语言的单元测试框架,Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能

  2. 优点

    极限编程、重构

  3. 特性

    1. 用于测试期望结果的断言(Assertion)
    2. 用于共享共同测试数据的测试工具
    3. 用于方便的组织和运行测试的测试套件
    4. 图形和文本的测试运行器
  4. 常用注解

    1. @Before 注解:在每个测试方法之前执行;
    2. @After 注解:在每个测试方法之后执行;
    3. @BeforeClass 注解:在所有方法执行之前执行;
    4. @AfterClass 注解:在所有方法执行之后执行;
    5. @Test(timeout = xxx) 注解:设置当前测试方法在一定时间内运行完,否则返回错误
    6. @Test(expected = Exception.class) 注解:设置被测试的方法是否有异常抛出。抛出异常类型为:Exception.class
    7. @Ignore 注解:注释掉一个测试方法或一个类,被注释的方法或类,不会被执行
    8. @Test注解:被注解后的类可以理解为测试类的一个入口

2、IOC

1、getBean()的五种用法的区别

  1. context.getBean(String id/name)

    通过id值或name值进行找,找到就返回一个Object类型的对象,需要强制类型转换

  2. context.getBean(Class clazz)

    通过类型查找,无序类型转换,但是可能会存在多个类型相同的类型之间冲突,分不清要的是哪一个

  3. context.getBean(String id/name , Class clazz)

    通过类型和id/name查找,准确,无序类型转换,不冲突

  4. context.getBean(Class clazz , Object…objs)

    使用类型,通过工厂方法,使用objs初始化对象的参数列表

  5. context.getBean(String id/name , Object…objs)

    使用id/name,通过工厂方法,使用objs初始化对象的参数列表

2、bean的id和name属性的区别

  1. id的命名必须要满足XML的命名规范(不能以数字、符号开头,不能有空格等),而name的命名没有这么多的限定
  2. 在同一个上下文中,id和name之间的命名不能冲突,也就是id和id、id和name、name和name之间,都不能重名
  3. id只能取一个值,而name可以有多个值

3、IOC注入的方式

  1. IOC属性注入的方式一共有4种,分别为

    1. set注入

      本质是调用实体类的setXXX()方法来完成对象的创建

      在配置文档中使用<property name="" value=""/>标签

    2. 构造器注入

      本质是调用实体类的构造方法来创建对象

      在配置文档中使用<constructor-arg name=" " value=""/>标签

    3. @value注入

      使用@value注解在实体类的属性上,注解的值与属性的值进行绑定,不推荐这样子讲属性的值写死

      开启注解扫描

       <context:component-scan base-package="包名"/>
    4. 注解注入(推荐使用)

      使用@Configuration注解标注过的类相当于一个xml配置文档,而使用@Bean标记过的方法相当于xml配置文档中的<bean></bean>标签

4、xml配置和注解配置

  1. XML配置

    就是在applicationContext.xml配置文档中进行配置

  2. 注解配置

    在实体类上使用@Configuration注解之后,该类就等同于一个配置文档,不过要在配置文档中打开注解扫描

5、singleton与prototype的区别

  1. singleton(单例)

    @Scope(“singleton”)

    只有一个实例对象

    当将一个Bean定义设置为singleton作用域时,Spring IOC容器中只会存在一个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean定义相匹配,都只会返回该Bean的同一实例

  2. prototype

    @Scope(“prototype”)

    访问一次创建一个实例

    prototype作用域的Bean会在每次对该Bean请求(将其注入到另一个Bean中,或者以程序的方式调用容器的getBean()方法)时都创建一个新的Bean实例。对有状态的Bean应使用prototype作用域,而对无状态的Bean则应该使用singleton作用域。
    对于具有prototype作用域的Bean,Spring不能对该Bean的整个生命周期负责,具有prototype作用域的Bean创建后交由调用者负责销毁对象回收资源

6、懒加载与积极加载

  1. @Lazy(true)

    懒加载:用到的时候再进行加载,不用不加载

  2. @Lazy(false)

    默认是积极加载:事先加载好,不管用不用

7、IOC常用的注解

  1. @Component

    添加在实体类上,表示一个组件

  2. @Service

    添加在服务层,表示是服务层的代码

  3. @Controller

    添加在控制层,表示是控制层的代码

  4. @Repository

    添加在接口上,表示是接口

  5. @Bean

    添加在方法上,便是一个Bean对象

  6. @Configuration

    配置注解,添加在配置类上,相当于一个配置文档

  7. @Scope

    生存范围,默认是单例(singleton),可以更改为非单例(prototype)

  8. @Lazy

    加载策略,默认为懒加载(true),可以更改为积极加载(false)

  9. @Value

    对实体类的属性进行赋值绑定,不推荐使用

  10. @Resource

    根据名称自动注入

  11. @Autowired

    根据类型自动注入

  12. @Qualify

    与@Autowired结合,先按照类型进行寻找,如果类型冲突,就按照名称寻找

8、工厂模式的组成

  1. 接口

  2. 接口实现类

  3. 工厂类

    提供生产产品(接口实现类对象等)的方法,一般是静态公开方法

    最好设计成单例模式

9、案例:如何注入较复杂的属性(自定义、集合)

  1. 一个人有多辆车的时候

    Person类与Car类

    import java.util.List;
    
    public class Person {
    
        private String name; //姓名
        private String gender; //性别
        private int age; //年龄
        private List<Car> cars; //这个人拥有多辆车;
    
        public Person() {
        }
        
        public Person(String name, String gender, int age, List<Car> cars) {
            this.name = name;
            this.gender = gender;
            this.age = age;
            this.cars = cars;
        }
        
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public List<Car> getCars() {
            return cars;
        }
    
        public void setCars(List<Car> cars) {
            this.cars = cars;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", gender='" + gender + '\'' +
                    ", age=" + age +
                    ", cars=" + cars +
                    "}";
        }
    }
    
    //Car类
    public class Car {
    
        private String brand; //品牌
        private String color; //颜色
        private int price; //价格
    
        public Car() {
        }
    
        public Car(String brand, String color, int price) {
            this.brand = brand;
            this.color = color;
            this.price = price;
        }
    
        public String getBrand() {
            return brand;
        }
    
        public void setBrand(String brand) {
            this.brand = brand;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    
        public int getPrice() {
            return price;
        }
    
        public void setPrice(int price) {
            this.price = price;
        }
    
        @Override
        public String toString() {
            return "Car{" +
                    "brand='" + brand + '\'' +
                    ", color='" + color + '\'' +
                    ", price=" + price +
                    '}';
        }
    }
    1. 使用xml文档配置

      使用list标签和ref标签的形式,表述集合

      或根据id的值自动注入

          <bean id="car1" class="org.westos.domain.Car">
              <property name="brand" value="BENZ"/>
              <property name="color" value="黑色"/>
              <property name="price" value="400000"/>
          </bean>
      
      
          <bean id="car2" class="org.westos.domain.Car">
              <property name="brand" value="BMW"/>
              <property name="color" value="红色"/>
              <property name="price" value="300000"/>
          </bean>
      
          <bean id="myP2" class="org.westos.domain.Person">
              <property name="name" value="张三"/>
              <property name="gender" value=""/>
              <property name="age" value="23"/>
              <property name="cars">
                  <list>
                      <ref bean="car1"/>
                      <ref bean="car2"/>
                  </list>
              </property>
          </bean>
    2. 使用注解方式注入

      • @Resource:按照名称找到然后自动注入

        严谨,但是没有Autowire灵活

      • @Autowire:按照类型找注到然后自动注入

        更加的灵活,当以多态接口的形式,会找该接口的所有的实现类的对象,更加的灵活

      • @Autowire与@Qualify结合

        先按照类型去寻找,如果类型冲突,就按照名字去找。

       @Resource
          private List<Car> myCars1;
      
          @Bean("myP1")
          public Person getMyPerson() {
              return new Person("范冰冰", "女", 20, myCars1);
          }
      
          @Bean("myCars1")
          public List<Car> getMyCars1() {
              List myCars1 = new ArrayList<Car>();
              myCars1.add(getCar3());
              myCars1.add(getCar4());
              return myCars1;
          }
       @Bean("car3")
          public Car getCar3() {
              return new Car("TOYOTA", "白色", 80000);
          }
      
          @Bean("car4")
          public Car getCar4() {
              return new Car("NISSAN", "蓝色色", 60000);
          }
    3. 测试类

      public class PersonDomainTest {
      
          private static ApplicationContext context;//XML文档连接对象
      
          //@BeforeClass,测试类的初始化过程,仅仅初始化一次。
          @BeforeClass
          public static void initContext(){
              context = new ClassPathXmlApplicationContext("applicationContext.xml");
          }
          
          @Test
          public void testGetPersonBean(){
              Person p = (Person) context.getBean("myP2");
              System.out.println(p);
          }
      }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章