文章目录
1、Junit测试工具
-
什么是Junit
JUnit是一个Java语言的单元测试框架,Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能
-
优点
极限编程、重构
-
特性
- 用于测试期望结果的断言(Assertion)
- 用于共享共同测试数据的测试工具
- 用于方便的组织和运行测试的测试套件
- 图形和文本的测试运行器
-
常用注解
- @Before 注解:在每个测试方法之前执行;
- @After 注解:在每个测试方法之后执行;
- @BeforeClass 注解:在所有方法执行之前执行;
- @AfterClass 注解:在所有方法执行之后执行;
- @Test(timeout = xxx) 注解:设置当前测试方法在一定时间内运行完,否则返回错误
- @Test(expected = Exception.class) 注解:设置被测试的方法是否有异常抛出。抛出异常类型为:Exception.class
- @Ignore 注解:注释掉一个测试方法或一个类,被注释的方法或类,不会被执行
- @Test注解:被注解后的类可以理解为测试类的一个入口
2、IOC
1、getBean()的五种用法的区别
-
context.getBean(String id/name)
通过id值或name值进行找,找到就返回一个Object类型的对象,需要强制类型转换
-
context.getBean(Class clazz)
通过类型查找,无序类型转换,但是可能会存在多个类型相同的类型之间冲突,分不清要的是哪一个
-
context.getBean(String id/name , Class clazz)
通过类型和id/name查找,准确,无序类型转换,不冲突
-
context.getBean(Class clazz , Object…objs)
使用类型,通过工厂方法,使用objs初始化对象的参数列表
-
context.getBean(String id/name , Object…objs)
使用id/name,通过工厂方法,使用objs初始化对象的参数列表
2、bean的id和name属性的区别
- id的命名必须要满足XML的命名规范(不能以数字、符号开头,不能有空格等),而name的命名没有这么多的限定
- 在同一个上下文中,id和name之间的命名不能冲突,也就是id和id、id和name、name和name之间,都不能重名
- id只能取一个值,而name可以有多个值
3、IOC注入的方式
-
IOC属性注入的方式一共有4种,分别为
-
set注入
本质是调用实体类的setXXX()方法来完成对象的创建
在配置文档中使用<property name="" value=""/>标签
-
构造器注入
本质是调用实体类的构造方法来创建对象
在配置文档中使用<constructor-arg name=" " value=""/>标签
-
@value注入
使用@value注解在实体类的属性上,注解的值与属性的值进行绑定,不推荐这样子讲属性的值写死
开启注解扫描
<context:component-scan base-package="包名"/>
-
注解注入(推荐使用)
使用@Configuration注解标注过的类相当于一个xml配置文档,而使用@Bean标记过的方法相当于xml配置文档中的<bean></bean>标签
-
4、xml配置和注解配置
-
XML配置
就是在applicationContext.xml配置文档中进行配置
-
注解配置
在实体类上使用@Configuration注解之后,该类就等同于一个配置文档,不过要在配置文档中打开注解扫描
5、singleton与prototype的区别
-
singleton(单例)
@Scope(“singleton”)
只有一个实例对象
当将一个Bean定义设置为singleton作用域时,Spring IOC容器中只会存在一个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean定义相匹配,都只会返回该Bean的同一实例
-
prototype
@Scope(“prototype”)
访问一次创建一个实例
prototype作用域的Bean会在每次对该Bean请求(将其注入到另一个Bean中,或者以程序的方式调用容器的getBean()方法)时都创建一个新的Bean实例。对有状态的Bean应使用prototype作用域,而对无状态的Bean则应该使用singleton作用域。
对于具有prototype作用域的Bean,Spring不能对该Bean的整个生命周期负责,具有prototype作用域的Bean创建后交由调用者负责销毁对象回收资源
6、懒加载与积极加载
-
@Lazy(true)
懒加载:用到的时候再进行加载,不用不加载
-
@Lazy(false)
默认是积极加载:事先加载好,不管用不用
7、IOC常用的注解
-
@Component
添加在实体类上,表示一个组件
-
@Service
添加在服务层,表示是服务层的代码
-
@Controller
添加在控制层,表示是控制层的代码
-
@Repository
添加在接口上,表示是接口
-
@Bean
添加在方法上,便是一个Bean对象
-
@Configuration
配置注解,添加在配置类上,相当于一个配置文档
-
@Scope
生存范围,默认是单例(singleton),可以更改为非单例(prototype)
-
@Lazy
加载策略,默认为懒加载(true),可以更改为积极加载(false)
-
@Value
对实体类的属性进行赋值绑定,不推荐使用
-
@Resource
根据名称自动注入
-
@Autowired
根据类型自动注入
-
@Qualify
与@Autowired结合,先按照类型进行寻找,如果类型冲突,就按照名称寻找
8、工厂模式的组成
-
接口
-
接口实现类
-
工厂类
提供生产产品(接口实现类对象等)的方法,一般是静态公开方法
最好设计成单例模式
9、案例:如何注入较复杂的属性(自定义、集合)
-
一个人有多辆车的时候
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 + '}'; } }
-
使用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>
-
使用注解方式注入
-
@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); }
-
-
测试类
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); } }
-