欢迎来看我的网络日志,交流请加我好友: 919201148。欢迎关注公众号或视频号:蜗牛互联网
Solo  当前访客:4 开始使用

蜗牛学编程

微信搜索「蜗牛互联网」,回复 1024 有惊喜!!! 程序员 | 互联网 | 科技 | Java | 架构 | 职场进阶 | 财富进阶

使用@Autowire注解与自动装配

2016-06-01 19:20:12 huayonglun
0  评论    207  浏览

@Autowired注解 Autowire 默认是按类型匹配 @ Autowire 如果你要修改 Autowire,按名称匹配可以 @Autowired @Qualifier(“MypersonDao”) ,如果在beans.xml中没有发现有这个名字的bean,则会有异常 @Autowired(required=true) @Qualifier(“MypersonDao”), 表示这个bean必须注入值,不然报错 用于字段上 @Autowired private PersonDao personDao; 用于属性的setter方法上 @Autowired public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } 扩展 @Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false,如果我们向使用按名称装配,可以结合@Qualifier注解一起使用。如下: @Autowired @Qualifier....

, , ,

用@Resource注解完成属性装配

2016-06-01 18:20:12 huayonglun
0  评论    215  浏览

bean的注入方式有3种: 第一种:使用构造器注入 第二钟:使用属性setter方法注入 第三种:使用Field注入(用于注解方式) 使用注解的方式完成bean的注入 在java代码中使用@Autowired或@Resource注解方式进行装配,这两个注解的区别是: @Autowired 默认按类型装配。是spring的api。 @Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。但一旦指定了name属性,就只能按名称装配了。是jdk的api。使用它可以不依赖spring的特性。 @Resource 1.修改beans.xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.sp....

, , ,

使用构造器装配属性

2016-06-01 17:00:12 huayonglun
0  评论    212  浏览

以前我们都是使用setter方法给属性注入值的,现在我们来看看另外一种注入方法:构造器注入 步骤 1.改写PersonServiceBean,为注入的属性加上构造方法 public PersonServiceBean(PersonDao personDao, String name) { this.personDao = personDao; this.name = name; } 2.配置beans.xml,其中配置了一个依赖属性和一个基本的String类型 <!-- 使用构造器装配属性 --> <bean id="personDao" class="com.liuyong666.dao.impl.PersonDaoBean"></bean> <bean id="personService" class="com.liuyong666.service.impl.PersonServiceBean"> <constructor-arg index="0" ref="personDao" type="com.liuyong666.....

, , ,

Spring如何装配各种集合类型的属性

2016-05-31 18:20:12 huayonglun
0  评论    212  浏览

首先在bean里面声明这些属性,并设置相应的更改器方法和访问器方法 private Set<String> sets = new HashSet<>(); private List<String> lists = new ArrayList<>(); private Properties properties = new Properties(); private Map<String, String> maps = new HashMap<> (); 接着在beans.xml做如下配置 <property name="sets"> <set> <value>set第一个</value> <value>set第二个</value> <value>set第三个</value> </set> </property> <property name="lists"> <set> ....

, , ,

Spring装配基本属性的原理

2016-05-31 17:20:12 huayonglun
0  评论    213  浏览

依赖注入对象方式二 使用内部bean,但该bean不能被其他bean使用 <bean id="personService" class="com.liuyong666.service.impl.PersonServiceBean"> <property name="personDao"> <bean class="com.liuyong666.dao.impl.PersonDaoBean"></bean> </property> </bean> 两种方式的优缺点比较 使用ref的方式,引用的bean可以被多个bean引用 而采用内部bean的方式,内部bean只能为那个bean里面那那个属性使用。 前面都是注入依赖对象,那么如何注入基本类型呢? 例如,在PersonServiceBean里面添加一个String类型的name属性和Integer类型的id属性,可以这样注入值: <property name="name" value="huayonglun"></property&g....

, , ,

Spring依赖注入的原理

2016-05-29 18:20:12 huayonglun
0  评论    213  浏览

使用Spring,可以使用里面的控制反转把依赖对象交给Spring管理,并把依赖对象通过容器注入到组件内部。 那么在Spring里面,该如何把对象注入到组件内部呢? 创建一个PersonDao对象,并把这个对象注入到PersonServiceBean中 依赖注入使用 PersonDaoBean package com.liuyong666.dao.impl; import com.liuyong666.dao.PersonDao; public class PersonDaoBean implements PersonDao{ @Override public void add(){ System.out.println("执行PersonDaoBean里的add()方法"); } } 抽取接口 package com.liuyong666.dao; public interface PersonDao { public abstract void add(); } 说明 接口跟实现类不要放一块,接下来,如何将PersonDaoBean对象注入进PersonServiceBea....

, , ,

配置Spring管理的bean的作用域

2016-05-28 18:20:12 huayonglun
0  评论    211  浏览

配置Spring管理的bean的作用域 .singleton 在每一个spring IoC容器中一个bean定义只有一个对象实例。默认情况下会在容器启动时初始化bean,但我们可以指定bean节点的lazy-init = "true"来延迟初始化bean,这时候,只有第一次获取bean才会初始化bean。如下: <bean id="persionService" class="com.liuyong666.service.impl.PersionServiceBean" lazy-init = "ture"/> 如果想对所有bean都应用延迟初始化,可以在节点beans设置default-lazy-init = “ture” ,如下: <beans default-lazy-init = "ture".../> .prototype 每次从容器获取bean都是新的对象。 在第一次获取bean时初始化 <bean id="persionService" class="com.liuyong666.service.impl.PersionSe....

, ,

Spring管理的Bean的生命周期

2016-05-28 18:20:12 huayonglun
0  评论    216  浏览

Bean实例化之后的初始化工作 实现接口 org.springframework.beans.factory.InitializingBean 接口指定一个单一的方法: void afterPropertiesSet() throws Exception; 因此,你可以简单地实现上述接口和初始化工作可以在 afterPropertiesSet() 方法中执行,如下所示: public class PersionServiceBean implements InitializingBean { public void afterPropertiesSet() { // do some initialization work } } XML配置 在基于 XML 的配置元数据的情况下,你可以使用 init-method 属性来指定带有 void 无参数方法的名称。例如: <bean id="persionService" class="com.liuyong666.service.impl.PersionServiceBean" init-method="init"....

, ,

struts2中自定义类型转换器之全局类型转换器

2016-05-28 02:50:27 huayonglun
0  评论    211  浏览

全局类型转换器 如果业务需求所有的日期都要转换,则可以使用全局类型转换器,只要在src根目录下面放置xwork-conversion.properties文件,并且properties文件中的内容为: 待转换的类型=类型转换器的全类名 如:Java.util.Date = com.liuyong666.type.converter.DateTypeConverter。 总体目录结构: 局部类型转换器和全局类型转换器的说明 局部类型转换器是对指定action指定属性进行转换。不管该action的该属性是数组还是List集合,该转换器的转换方法对该属性只转换一次,假设某个action有一个List类型的属性users,那么局部类型转换器只调用一次convertValue方法,该方法吧users请求参数一次性地转换为一个List集合对象。 全局类型转换器会对所有action的特定类型进行转换。如果一个action的某个需要转换的属性是数组或集合,那么全局类型转换器将不是对该集合或数组整体进行转换,而是对该集合或数组的每一个属性进行转换。 欢迎关注微信公众号,技术,思维,心理,....

, ,

struts2中自定义类型转换器之局部类型转换器

2016-05-28 02:50:27 huayonglun
0  评论    219  浏览

Struts2自定义类型转换器 应用中,常需要将字符串请求参数转换为相应的数据类型,或将一定的数据类型类型转换为字符串显示显示给用户,Struts2提供了类型转换机制。 Struts2的类型转换是基于OGNL表达式的,只要我们把HTML输入项(表单元素和其他GET/POET的参数)命名为合法的OGNL表达式,就可以充分利用Struts2的转换机制。 除此之外,Struts2提供了很好的扩展性,可以实现自己的类型转换器,完成字符串和自定义复合类型之间的转换。总之,Struts2的类型转换器提供了非常强大的表现层数据处理机制,可以利用Struts2的类型转换机制来完成任意的类型转换。 Struts2自定义类型转换器分为局部类型转换器和全局类型转换器。 局部类型转换器:对某个action起作用 全局类型转换器:对所有的action起作用 局部类型转换器 如果页面传来一个参数xxx.action?birthday=20160527到后台action,然后action属性用Date类型进行接收,用Date类型是获取不到,并且会出现错误的,struts2提供了一种类型转换器供我们使用。....

, ,

模拟spring自定义上下文获取bean

2016-05-27 18:20:12 huayonglun
0  评论    217  浏览

模拟spring自定义上下文获取bean 利用dom4j解析 设置两个域,一个List存放BeanDefinition,一个Map存放实例化对象的映射 构造器传配置文件进去,依次执行两个方法 方法1,读取配置文件,把解析出的BeanDefinition放入List中 方法2,完成bean的实例化,把实例化对象的映射放入Map中 定义获取bean实例的方法,从Map中根据实例名返回Object对象 import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.XPath; import org.dom4j.io.SAXReader; /** * 自己的容器 * @author Administrator * */ public class MyClassPathXM....

, ,

【Spring 系列】二、spring三种实例化bean的方式

2016-05-27 18:17:12 huayonglun
0  评论    213  浏览

【Spring 系列】二、spring三种实例化bean的方式 beans.xml中配置 <!-- 三种实例化bean的方式 --> <!-- 1.使用类构造器实例化 --> <bean id="personService" class="com.liuyong666.service.impl.PersonServiceBean"></bean> <!-- 2.使用静态工厂方法实例化 --> <bean id="personService2" class="com.liuyong666.service.impl.PersonServiceBeanFactory" factory-method="createPersonServiceBean"></bean> <!-- 3.使用实例工厂方法实例化 --> <bean id="personServiceFactory" class="com.liuyong666.service.impl.PersonServiceBeanFacto....

, ,

【Spring 系列】一、如何从spring中获取bean

2016-05-27 16:20:12 huayonglun
0  评论    209  浏览

【Spring 系列】一、如何从spring中获取bean 导包 spring要管理的类信息 package com.liuyong666.service.impl; ​ import com.liuyong666.service.PersonService; public class PersonServiceBean implements PersonService { @Override public void save(){ System.out.println("我是save()方法"); } } spring面向接口编程,该类对应的接口 public interface PersonService { ​ public abstract void save(); ​ } 配置beans.xml文件,文件在src目录下 <bean id="personService" class="com.liuyong666.service.impl.PersonServiceBean"></bean> 使用spring获取bean @Test ​ ....

, ,

struts2中请求参数接收

2016-05-27 02:50:27 huayonglun
0  评论    218  浏览

采用基本类型接受请求参数(get/post) 在Action类中定义与请求参数同名的属性,struts2便能自动接收请求参数并赋予给同名的属性。 请求路径:http://localhost:8080/action/xxx.action?id=66 public class HelloWorldAction { private Integer id; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } } 采用复合类型接受请求参数 获取Bean属性的原理: Struts2首先通过反射技术调用Person的默认构造器创建person的实例,然后再通过反射技术调用person中与请求参数同名的属性的setter方法,来获取请求参数数值。 请求路径:http://localhost:8080/action/xxx.action?person.id=1&person.name=zhangsan 实体bean public class Person { p....

, ,

集合包之List

2016-05-13 00:22:08 huayonglun
0  评论    220  浏览

集合包 Collection:多个单对象 Map:键值对 ArrayList 实现: 数组实现 add(E) 更新minCapacity为已有数量+1 和Object数组比大小 若minCapacity大,将当前数组赋给一个数组对象,新容量为old * 1.5 + 1 若数组新容量大小仍小于minCapacity,更新minCapacity为新容量值 调用Arrays.CopyOf生成新数组对象 添加元素E进入数组 remove(E) 判断E是否为null 是,找出null,调用fastRemove完成对象的删除 否,equals比较,调用fastRemove remove(int) 相比较remove(E),多了数组范围检测 少了对象位置查找,性能更好 get(int) 获取单个对象 先进行数组范围检测 然后直接返回 iterator() 遍历对象 AbstractList的实现 hasNext() next() 获取的modCount与当前的modCount比较 不等,集合大小发生改变,抛ConcurrentM....

, , ,

Java分布式之性能调优

2016-05-12 00:26:08 huayonglun
0  评论    215  浏览

寻找性能瓶颈 CPU消耗分析   Linux中,CPU主要用于中断、内核以及用户进程的任务处理,优先级为中断>内核>用户进程 上下文切换 每个CPU同一时间只能执行一个线程,Linux采用抢占式调度 发生条件: 到达执行时间 I/O阻塞 高优先级线程要执行 Java中: 文件I/O 网络I/O 锁等待 线程sleep 缺点: 切换过多,造成内核占据较多的CPU使用,使应用的响应速度下降 运行队列 每个CPU核都维护了一个可运行的线程队列。 运行队列值越大,意味着线程会消耗越长的时间才能执行完 利用率 CPU在用户进程、内核、中断处理、IO等待以及空闲五个部分使用百分比 Linux中,top或pidstat可查看进程中线程的CPU消耗状况 top命令第3行为CPU信息 us表示用户进程百分比 sy表示内核进程 ni表示被nice命令改变优先级的任务所占的百分比 id表示CPU的空闲时间 wa表示在执行过程中等待IO hi表示硬件中断 si表示软件中断 shift+h 可切换Tasks和Threads pidstat 需要安装sy....

, , ,

16.Java存储模型

2016-05-11 02:26:31 huayonglun
0  评论    216  浏览

高层的设计问题,比如安全发布、规约、以及遵守同步策略等等。它们的安全性得益于JMM,当你理解了这些机制会如此工作后,能发现可以更容易有效地使用它们。 16.1 什么是存储模型,要它何用 假设一个线程为变量a赋值:a = 3; 存储模型要回答这个问题:“在什么条件下,读取a的线程会看到3这个值?” 编译器生成指令的次序,可以不同于源代码所暗示的“显然”的版本,而且编译器还会把变量存储在寄存器,而不是内存中;处理器可以乱序或者并行地执行指令;缓存会改变写入提交到主内存的变量的次序;最后,存储在处理器本地缓存中的值,对于其他处理器并不可见。这些因素都会妨碍一个线程看到一个变量的最新值,而且会引起内存活动在不同的线程中表现出不同的发生次序——如果你没有适当同步的话。 Java语言规范规定了JVM要维护内部线程类似顺序化语意:只要程序的最终结果等同于它在严格的顺序化环境中执行的结果,那么上述所有行为是允许的。 最近几年,重新排序后的指令使得程序在计算性能上得到了很大的提升。对性能提升作出贡献的,除了越来越高的时钟频率,还有不断提升的并行性——管道超标量体系结构执行单元,动态指令调度,试探性执....

, ,

15.原子变量与非阻塞同步机制

2016-05-10 02:26:31 huayonglun
0  评论    216  浏览

java.util.concurrent包中的许多类,比如Semaphore和ConcurrentLinkedQueue,都提供了比使用synchronized更好的性能和可伸缩性。这一章,我们来学习这些性能提升的原始来源:原子变量和非阻塞的同步机制。 近来很多关于并发算法的研究都聚集在非阻塞算法上,这种算法使用低层原子化的机器指令取代锁,比如比较并交换,从而保证数据在并发访问下的一致性。非阻塞算法广泛用于操作系统和JVM中的线程和进程调度、垃圾回收以及实现锁和其他并发数据结构。 与基于锁的方案相比,非阻塞算法的设计和实现都要复杂得多,但是它们在可伸缩性或活跃度上占有很大的优势。因为非阻塞算法可以让多个线程在竞争相同资源时不会发生阻塞,所以它能在更精化的层面上调整粒度,并能大大减少调度的开销。 进一步而言,它们对死锁和其他活跃度问题具有免疫性。在基于锁的算法中,如果一个线程在持有锁的时候休眠,或者停滞不前,那么其他线程就都不可能前进了,而非阻塞算法不会受到单个线程失败的影响。 在java 5.0 中,使用原子变量类,比如AtomicInteger和AtomicReference,能够高....

, ,

14.构建自定义的同步工具

2016-05-09 02:26:31 huayonglun
0  评论    216  浏览

类库中包含了大量依赖于状态(state-dependent)的类——这些类拥有基于状态的先验条件——FutureTask、Semaphore和BlockingQueue。例如,你不能从一个空队列中移除条目,也不能从一个尚未结束的任务中获取结果;在这些操作可以执行前,你必须等到队列进入“非空”状态,任务进入“完成”状态。 创建状态依赖类最简单的方法通常是将它构建于已有的状态依赖库之上。如果类库没有提供你需要的功能,你也可以使用语言和类库提供的底层机制,包括内部条件队列、显示的Condition对象和AbstractQueuedSynchronizer框架,构建属于自己的Synchronizer。这一章探究一些实现状态依赖性时要面对的不同选择,以及使用平台提供的状态依赖性机制时需要遵守的不同规则。 14.1 管理状态依赖性 生产者-消费者的设计经常会使用ArrayBlockingQueue这种有限缓存。一个有限缓存提供的put和take操作,每一个都有先验条件:你不能从空缓存中获取元素,也不能把元素置入已满的缓存中。如果依赖于状态的操作在处理先验条件时失败,可以抛出异常或者返回错误状态....

, ,

13.显式锁

2016-05-08 02:26:31 huayonglun
0  评论    214  浏览

在Java 5.0之前,用于调节共享对象访问的机制只有synchronized和volatile Java 5.0 提供了新的选择:ReentrantLock。 ReentrantLock并不是作为内部锁的替代,而是当内部锁被证明受到局限时,提供可选择的高级特性。 13.1 Lock 和 ReentrantLock Lock接口,定义了一些抽象的锁操作 与内部加锁机制不同,Lock提供了 无条件 可轮询 定时 可中断的锁获取操作 所有加锁和解锁的方法都是显式的。 public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); Condition newCondition(); } ReentrantLock实现了Lock接口,提供了与synchronized相同的互斥和内存可见....

, ,
TOP