各种杂乱总结

1.关于activemq的随想

发送,通过点对点发送到相应到队列上;接收,通过监听接收mq发来的信息,接收类实现MessageListener接口,在onMessage(Message message)方法中实现对消息的接收及业务的相关处理;一般activemq都是以集群的方式使用,activemq配置的方式一般以zookeeper的方式为注册中心,这样可以达到负载均衡的作用。关于zookeeper的作用是保持负载均衡,数据的唯一性等。关于配置也相应的比较简单。ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户

2.spring自动装配

autowired和resource。autowired是按类型自动装配,resource是按name自动装配。一般@Resource(name="aaa"),如果去掉(name="aaa")时,会按默认名字自动装配,如果装配不上时会按类型进行自动装配。如果name不为空,则只能按name进行装配。

3.spring实例化

、@controller 控制器(注入服务)
、@service 服务(注入dao)
、@repository dao(实现dao访问)
、@component (把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)

4.spring对bean进行管理

spring对bean进行管理,可以管理bean的生命周期,我们也可以通过实行spring的不同的接口,在干预spring对bean的管理。如InitializingBean接口,里面有

public void afterPropertiesSet() throws Exception {
System.out.println("回调函数,会在bean属性设置完成后调用");
}

方法。可以完成的操作如system里面。还有:

BeanPostProcessor接口和BeanFactoryPostProcessor接口

可以处理不同的业务。

对spring bean来讲,我们默认可以指定两个生命周期回调方法。一个是在ApplicationContextbean初始化,包括注入对应的依赖后的回调方法;另一个是在ApplicationContext准备销毁之前的回调方法。要实现这种回调主要有三种方式:实现特定的接口、在XML配置文件中指定回调方法和使用JSR-250标准的注解。

5.一般bean会在spring容器初始化的时候,会实例化所有的单例bean,如果不想被初始化,则需要在配置bean的时候加上懒加载,lazy-init="true",这个时候会在调用的时候才实例化,但是如果此bean被其他非懒加载的单例bean引用,则也会被实例化.
6.bean的实例化都是通过构造器进行实例化。如果构造器非默认有参数的话,则用constructor-arg来指定对应的参数,多个参数的话,当有多个构造参数时就需要使用多个constructor-arg进行定义,默认会将定义的顺序作为参数的顺序。也可以指定顺序,如
<bean id="hello" class="com.app.Hello">
<constructor-arg index="1" value="true"/><!-- b2 -->
<constructor-arg index="0" value="str1"/><!-- str1 -->
<constructor-arg index="2" value="3"/><!-- i3 -->
</bean>
也可以通过name来。一般是不提倡的,如果用name的话,需要class是通过debug的方式来编译的。
对于注入的为bean的时候,可以通过ref属性来指定。如下:
<bean id="world" class="com.app.World"/>
<bean id="hello" class="com.app.Hello">
<constructor-arg ref="world"/>
</bean>
所以对于bean的注入,上面的构造器方式注入。然后就是通过set方式注入。然后就是通过ref(非基本类型)或value(基本类型)注入。
7.p命名空间和c命名空间,也是注入的别名而已。如下:
<bean id="world" class="com.app.World"/>

<!-- 通过set方法注入的传统的bean定义 -->
<bean id="hello1" class="com.app.Hello">
<property name="p1" value="v1"/>
<property name="p2" value="v2"/>
<property name="world" ref="world"/>
</bean>

<!-- 通过set方法注入的使用p命名空间的bean定义 -->
<bean id="hello2" class="com.app.Hello" p:p1="v1" p:p2="v2" p:world-ref="world"/>
c命名空间为:
<bean id="world" class="com.app.World"/>

<!-- 传统的使用constructor-arg通过构造方法注入的bean定义 -->
<bean id="hello1" class="com.app.Hello">
<constructor-arg index="0" value="arg1"/>
<constructor-arg index="1" value="2"/><!-- arg2 -->
<constructor-arg index="2" ref="world"/><!-- arg3 -->
</bean>
<!-- 使用c命名空间通过构造方法注入的bean定义 -->
<bean id="hello2" class="com.app.Hello" c:arg1="c_arg1" c:arg2="2" c:arg3-ref="world"/>
8.基于xml配置的自动注入
定义bean的时候指定autowire 其中参数为:no,byName,byType,constructor。也可以默认,统一的 定义:default-autowire="byName">
9.单例bean注入多例bean方式
因为单例bean在ApplicationContext是唯一的,也就是实例化一次,当单例bean实例化是,会实例化其依赖的一个多例bean,因为单例bean只
实例化一次,所以不能保证。还有一个方法是通过配置参数look-method来实现,如下:
<bean id="beanB" class="com.app.BeanB" scope="prototype"/>
<bean id="beanA" class="com.app.BeanA">
<!-- 表示将由Spring重写getBeanB()方法,并返回名为beanB的bean -->
<lookup-method name="getBeanB" bean="beanB"/>
</bean>
经过以上两步以后每次在调度beanA的getBeanB()方法时,Spring都重新从bean容器中获取一个beanB,因为beanB定义为多例形式,所以每次都会获取一个全新的BeanB对象。
10.spring可以不改变一个bean的情况下,替换bean中的方法。配置如下:
<bean id="beanAReplacer" class="com.app.BeanAReplacer"/>
<bean id="beanA" class="com.app.BeanA">
<replaced-method name="add" replacer="beanAReplacer"/>
</bean>
beanAReplacer替换beanAReplacer中的add方法。BeanAReplacer 要实现MethodReplacer
11.<context:component-scan/>的配置会自动以单例实例化到bean容器中,会自动开启注解,不需要在单独配置<context:annotation-config/>了

12.在spring中#{}和${}的区别是,#{}是spring的SPEL表达式,${}是取配置文件中的key。都支持在注解中使用。

13.jdk7的hashMap和currentmentHashMap.对于hashMap来说,比较简单,就是数组和链表的结构。对于currentmentHashMap来说,是支持并发的,也比较简单,也就是在数组和链表结构上面加一个segment,支持并发的。最多有16个segment,也就是说,jdk7的currentmentHashMap最多支持16个并发。默认为16个,也是可以改的。每个segment下面都有一个数组和链表结构的数据结构。锁机制是加在segment上的,segment也叫段,所以也叫做分段加锁。
jdk8的hashMap和currentmentHashMap。对hashMap来说,与jdk7相比,加入了红黑树,数组+链表+红黑树。节点是node,不是entity了。如下解释:
根据 Java7 HashMap 的介绍,我们知道,查找的时候,根据 hash 值我们能够快速定位到数组的具体下标,但是之后的话,需要顺着链表一个个比较下去才能找到我们需要的,时间复杂度取决于链表的长度,为 O(n)。
为了降低这部分的开销,在 Java8 中,当链表中的元素超过了 8 个以后,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度为 O(logN)。

14.quartz默认是并行的,如果要串行,需要配置参数为:

<bean id="transmitTask"   class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  

    <property name="targetObject">  

        <ref bean="transTaskBusiness" />  

    </property>  

    <property name="targetMethod">  

        <value>execute</value>  

    </property>  

    <property name="concurrent">  

        <value>false</value>  

    </property>  

</bean> 

原文地址:https://www.cnblogs.com/yanghuiping/p/7754752.html