20170601
来源:互联网 发布:tough cookie.js 编辑:程序博客网 时间:2024/06/10 21:28
计划:
1servlet学习
2多线程学习第一部分
3线程池
4mysql与oracle区别
5 60题练习
6 20页 spring学习
一 servlet学习
1.1-servlet简介
servlet首先要实现servlet接口,然后要发布在servlet服务器上
我们通常对实现了servlet接口的类,也叫做servlet
servlet在服务器第一次调用时装载,第二次时首先检查有无此servlet存在
生命周期:init service destroy
1.2-在项目中使用servlet
1.2.1创建一个servlet
1.2.2我们一般继承httpServlet类来实现web功能
1.2.3在web.xml中配置servlet-name
servlet-class
servlet-mapping
servlet-name
url-pattern
用于实现对servlet的拦截
同一个servlet可以被映射到多个地址上
1.3-servlet存在线程安全问题
解决办法:
在使用共享的变量时,加上synchronized(this){}代码块,但是不推荐
二 线程学习
2.1-线程的几个状态
2.1.1新建-》就绪=-》运行-》终止
2.1.2三个阻塞状态
1 等待阻塞 线程调用了wait方法:wait方法释放互斥锁
2 同步阻塞 运行到了同步块
3 其他阻塞 sleep,join:sleep方法不释放互斥锁
2.2 实现线程的两个方法
2.2.1
继承thread类 和实现runnable接口
2.3 几个线程应用的经典场景
2.3.1银行取款
2.3.2消费者/生产者模型注意:在生产者,消费者模型中,生产,消费代码应和产品代码在同一类中,消费者线程和生产者线程只是负责调用产品类2.3.3哲学家用餐问题
2.3 线程池
三mysql和oracle区别
1mysql免费oracle收费
2mysql分页用limit,oracle分页用rownum
3oracle支持行级锁mysql 只在innodb引擎里可以使用,
4mysql自动提交,oracle不自动提交
5两者事务支持的级别不同
6oracle有一些比较方便的函数mysql没有
7oracle 用到的一些函数 max min to_char to_date nvl round upper fm concat
/**
* 消费者
* @author Administrator
*
*/
public class ConsumerThread implements Runnable {
private Stocks stocks;
public ConsumerThread(Stocks stocks) { this.stocks = stocks;}@Overridepublic void run() { System.out.println("start 10 circulate"); for (int i = 0; i < 10; i++) { stocks.consumer(); }}
}
/**
* 生产者
* @author Administrator
*
*/
public class ProductorThread implements Runnable {
private Stocks stocks;
public ProductorThread(Stocks stocks) { this.stocks = stocks;}@Overridepublic void run() { System.out.println("start 10 circulate"); for (int i = 0; i < 10; i++) { stocks.produce(); }}
}
/**
* 产品工厂类
* @author Administrator
*
*/
public class Stocks {
public static double stockings = 0;
/** * 消费过程 */public synchronized void consumer() { if (stockings <= 0) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } stockings = stockings - 10; System.out.println("consuming 10 yuan ...."); notify();}/** * 生产 */public synchronized void produce() { if (Stocks.stockings >= 10) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } stockings = stockings + 10; System.out.println("product 10 yuan ...."); notify();}
}
四 20页spring学习34-54页
2.1 spring 配置的可选方案
三种主要装配机制
1xml中显示配置
2java中显示配置
3隐世的javabean发现机制,及自动装配(最简便)
2.2 自动化装配bean
spring从两个方面协作来实现了自动化装配
1组件扫描2自动装配2.2.1创建可被发现的bean >一个cd接口,它将具体cd的播放功能和cd本身的耦合降低 public interface CompacDisc{ void play(); } >cd 的实现类,添加compnont注解,可以被spring扫描到 @Component public class SgtPappers implements CompacDisc{ @Override public void play(){ system.out.print("play...."); } } >spring配置类,默认扫面配置类目录下的包 @Configuration @CompnentScan public class CDPlayerConfig{ } >使用xml开启扫描的话是<context:component-scan> <?xml version=.... <beans xlmns="/...> <context:component-scan base-package="xxxx"/> </beans>2.2.2为组件扫描的bean命名spring应用上下文所有的bean都会给一个id,默认为类名的首字母大写若想自定义bean id,则做如下修改@Component("your classId") public class SgtPappers implements CompacDisc{ @Override public void play(){ system.out.print("play...."); } } 2.2.3 设置组件扫描的基础包 作如下配置 @Configuration @ComponentScan("soundsystem") public class CDPlayerConfig(){ } 若你想更明确地表明你所设置的是基础包,那么可以用如下配置(可扫描多个包) @Configuration @ComponentScan(basePackages = {"soundsystem","video"}) public class CDPlayerConfig(){ } 给予如上配置在代码重构时可能会带来麻烦,所以可以写成如下配置 @Configuration @ComponentScan(basePackageClasses = {CDPlayer.class,Video.class}) public class CDPlayerConfig(){ } spring会扫描类所在的包及子包 2.2.4 通过为bean 属性 添加注解实现自动装配 为了实现自动转配,我们需要借助@Autowired注解,例子如下: @Component public class CDPlayer implements MediaPlayer{ private CompactDisc cd; @Autowired public CDPlayer { CompactDisc cd){ this.cd = cd; } public void play(){ cd.play(); } } @Autowired注解不仅能作用于构造器上,还能用于需要注入类的任意方法上,或者直接放在属性上 例子略(43页)
2.3 使用java代码显示装配bean
有时不能使用组件扫描和自动装配来实现bean的管理(例如第三方类库时),因此有时需要利用java代码显示的配置bean到spring中去
2.3.1 创建配置类(因为要显示装配bean,所以讲componentscan注解去掉了)
@Configuration
public class CDPlayerConfig{
@Bean
public class CompactDisc sgtPeppers(){
return new SgtPeppers();
}
@Beanpublic CDplayer(){
return new CDPlayer(sgtPeppers());
}
}
2.3.3 借助javaconfig实现注入如上述代码,spring默认bean是单例模式没有必要在位第二个cdplayer bean 创建完全相同的实例,spring会拦截对 sgtPeppers的调用,并确保返回的是唯一实例还有一种理解起来更简单的方式:@Beanpublic CDplayer(CompactDisc compactDisc){return new CDPlayer(compactDisc);}这样,spring在请求CDPlayer时,会自动把compactDIsc在spring中的bean注入进来注意:此处我们是把compactDisc 作为构造方法的参数传进去的,若是setter方法的话,则需写成如下形式,(即手动调用setter方法)@Beanpublic CDplayer(CompactDisc compactDisc){ return new CDPlayer().setCompactDisc(compactDisc);}
2.4 使用xml装配bean
作者在此处巴拉巴拉了一大堆关于xml是落后的配置,并希望我们开发时尽量选择自动化配置和javaconfig的话…
2.4.1 spring的配置文件要以<bean> 为根(springtools 可以创建xml的基本配置和xsd头)
2.4.2 声明一个简单的bean
<bean class=”soundsystem.SgtPeppers” id=”sgtPeppers”/>
2.4.3 借助构造器注入初始化bean
在xml配置中,只有一种声明bean的方式,就是使用<bean>元素来声明并制定class属性
①通过构造器注入bean
<bean id=”xxx” class=”xxx”>
<constructor-arg ref=”compactDisc”>
</bean>
使用c命名空间
<bean id=”xxx” class=”xxx” c:cd-ref=”compactDisc” /bean>
c 指构造方法
cd指参数名
ref指bean注入
或者c命名空间也可以使用位置参数
<bean id=”xxx” class=”xxx” c:_0-ref=”compactDisc” /bean>
_0指参数位置
② 将变量注入到构造器中
<constructor-arg value=”i want play…”>
c命名空间(直接参数名 + = 即可)
<c-title=”i want play…”>
- 20170601
- 20170601Link
- 20170601M_USER
- 20170601MemoLink
- 【PMP】学习笔记20170601
- 20170601メモbaijiahao
- 生活杂记 ----20170601
- springmvc学习记录-20170601
- 20170601学习笔记整理
- 记录昨天20170601
- android developer tiny share-20170601
- 大数据:前端职位统计(20170601)
- 20170601_C++中vector多维数组初始化及清零
- redis基本介绍--从菜鸟到熟悉||20170601redis管道命令介绍
- CSDN日报20170601 ——《程序猿职业生涯的迷惘与野望》
- Java实现几种常见排序方法
- HDU-4571-spfa,记忆化搜索,背包,DP
- Python爬虫神器PyQuery的使用方法
- Node入门
- kotlin的必修之路
- 20170601
- 数据库分年度统计数据量
- [Linux]用户(user)和用户组(group)管理与操作教程
- windows内核&驱动
- 463.整数排序
- Android中自动生成的APK存放目录
- jackson反序列化漏洞分析
- 老史聊架构:当当网架构优化的几点心得
- MySQL常用查询语句