分类 技术 下的文章

测试用例是用来验证达到预期结果,但不检查逻辑错误;测试用例不是用来证明你是对的,而是用来证明你没有错.

Maven:

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

在junit包下新建Cal计算类

package junit;

public class Cal {
    public int add(int a, int b) {
        return a + b;
    }
}

新建JUnit的测试类CalTest

- 阅读剩余部分 -

Spring配置有3种主要的装配机制:

  1. Java自动装配
  2. Java显式配置
  3. XML显式配置

Spring从组件扫描和自动装配满足自动化装配bean:

  • 组件扫描(component scanning):Spring自动发现应用上下文所创建的bean.
  • 自动装配(autowiring):Spring自动满足bean之间的依赖.

自动化装配可以在最大程度上将显式配置降低到最少,但在将第三方库中的组件装配到自己的应用时是无法添加@Component和@Autowired注解的,这个时候只能选择Java或XML的显式配置.

- 阅读剩余部分 -

通俗的解释Java的回调机制:A类调用了B类中的方法C,方法C又反过来调用了A类中的方法D,方法D就是回调方法,这个机制就叫做CallBack.

假设存在计算器类Cal、学生小明类XiaoMing以及老师测试类Tea。

处理流程

  1. 老师布置作业给小明 Question(a,b)
  2. 小明调用计算器 new Cal().add(a,b,this)
  3. 计算器计算 int result = a + b;
  4. 计算器回调小明的Answer(result)方法

1、学生类XiaoMing

public class XiaoMing {

    void Question(int a ,int b){
        new Cal().add(a,b,this);
    }
    void Answer(int result){
        System.out.println("答案是" + result);
    }
}

2、计算器类Cal

public class Cal {
    void add(int a,int b, XiaoMing xiaoMing){
        int result = a + b;
        xiaoMing.Answer(result);
    }
}

3、老师测试类Tea

public class Tea{
    public static void main(String args[]){
        new XiaoMing().Question(2,3);
    }
}

上述例子中,回调函数是Answer(),为了好理解,把学生类和计算器类耦合在一起了,假设小红XiaoHong也需要使用计算器Cal,现在的代码是无法实现的,所以在实际开发中,学生小明类XiaoMing一般是继承某个接口,且回调函数常用接口作为参数,下面的例子是改进后的。

- 阅读剩余部分 -

最近在实施公司的权限产品时遇到了路径配置的问题,最后发现是***配置有误。

Spring的AntPathMatcher借鉴了Apache的Ant风格,支持的通配符有:?***regexp [a-z]+

1、 ? 匹配任意单字符

applicationContext_jdbc_ ?.xml 可以匹配applicationContext_jdbc_ a.xml、applicationContext_jdbc_ 1.xml

2、* 匹配0个或更多个字符

conf/applicationContext_ * spring.xml 可以匹配conf路径下的applicationContext spring.xml、applicationContext admin _spring.xml 等

3、** 匹配0个或更多个目录

conf/ **/jdbc.xml 可以匹配conf路径下任意层级的以xml结尾的文件,例如conf/jdbc.xml 、conf/ com /jdbc.xml 、conf/ com/xxx/xxx/jdbc.xml

4、{spring:[a-z]+}.jsp后面匹配到的内容作为参数赋值给冒号之前的变量

com/{filename:\\w+}.jsp 匹配到com/test.jsp,并给filename赋值为test

- 阅读剩余部分 -

重定向是浏览器(客户端)行为,转发是服务端行为

重定向和转发

重定向:客户端发送request请求到web service1,webservice返回一个HTTP 302响应,并给出一个新的地址web service2,客户端再次发送请求到web service2,service2处理请求返回结果给客户端,这个过程客户端需要做至少两次请求。

转发:客户端发送request请求到web service1,web service1将请求转发到web service2,对于客户端而言,并不知道服务器内部是如何调用的,最常见的例子是nginx,所有的请求发送到nginx,nginx按照一定的规则发送给相应的web servicex。

- 阅读剩余部分 -

1、什么Class类,什么是反射

在Java中,任何一个类都是java.lang.Class类的实例对象,Class类只有Java虚拟机可以new出来。

反射指Java运行时,任意一个类都可以知道这个类的所有属性和方法;对于任意一个对象,都可以调用他的方法和属性,这种动态获取信息和动态调用对象方法的功能机制成为反射机制。

2、Class类的3种动态加载

2.1 getClass()

xxObject obj;
Class c1 = obj.getClass();

2.2 Class.forName("className")

Class c2 = Class.forName("java.util.HashMap");

注意className是类的完全限定名,且可能抛出ClassNotFoundException

2.3 T.class

Class c3 = java.util.HashMap.class;

参考资料:getClass()forName()T.class

- 阅读剩余部分 -

IoC容器初始化分为3个过程:

1、Resource定位:寻找BeanDefinition定义(常见为Xml)的位置。

BeanDefinition资源定位是由ResourceLoader通过Resource接口完成,这个接口可以对各种形式的BeanDefinition做处理。

2、BeanDefinition载入:把用户定义好的Bean表示成IOC容器内部的数据结构(BeanDefinition)

BeanDefinition是POJO对象在IOC容器的抽象,IOC容器通过BeanDefinition管理各个Bean。

3、向IoC容器注册BeanDefinition:通过BeanDefinitionRegistry接口注册到IoC容器。

把载入过程中解析到的BeanDefinition通过BeanDefinitionRegistry接口注册到IoC容器,在IOC容器内部通过HashMap持有BeanDefinition。

- 阅读剩余部分 -

正向代理: 是代理Client,为Client收发请求,对Sever来说,Server只知道Proxy存在,比如ShadowsSocks。
反向代理: 代理Server,为Server收发请求,Client只知道Proxy的存在,常用于负载均衡,比如Nginx。

反向代理和正向代理-张国利

未完成

线程安全指多线程操作同一个对象时,采用加锁机制,先后更改数据也不会造成数据不一致或者数据污染的情况,线程不安全时常用synchronized,但是这可能会带来性能问题。

Maven:

    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.10.2</version>
    </dependency>

获取网页内容、加载为Document对象

 Document doc = Jsoup.connect(String url).get();
 Document doc = Jsoup.parse(Strng url);
 Document doc = Jsoup.parse(String htmlSource);
<div id="main">
    <a id="title" name="title" class="large">
        Jsoup操作Document对象
    </a>
</div>

- 阅读剩余部分 -