IOC
Inversion of Control
控制反转
对象的创建交给Spring去做.
B类需要一个A类对象,按照惯例B类自己new一个A类对象.由B来控制A是否被创建.但是现在对象的创建交给Spring做了,那么控制关系就反过来了,称为控制反转.
DI
Dependecy Injection
依赖注入
B类需要一个A类对象,只能接受Spring容器的注入.
从容器角度来看,容器将A对象注入到B类中,就称为依赖注入
依赖注入各种类型constructor-arg/property
constructor-arg属性
value 可以传入8种基本数据类型/基本数据类型包装类/字符串
ref 引用容器中的bean实例
type 数据类型
index 在构造函数中的位置
name 构造函数中的名字
value标签
8种基本数据类型(byte/short/int/long/float/double/char/boolean)
1
public User(byte b) {}
基本数据类型包装类(Byte,Short,Integer,Long,Float,Double,Character,Boolean)
1
public User(Byte b) {}
字符串(String)
帅哥
public User(String b) {}
array标签
value-type 数据类型 默认是String类型
aabb
public User(String[] arr) {}
list标签
value-type 数据类型 默认是String类型
a10
public User(List list) {}
set标签
value-type 数据类型 默认是String类型
aabb
public User(Set set) {}
map标签
value-type 数据类型 默认是String类型
public User(Map map) {}
props标签
value-type 数据类型 默认是String类型
xx
public User(Properties prop) {}
bean标签
public User(Date date) {}
ref标签
引用容器中的bean实例
public User(Date date) {}
idref标签
引用bean的id是一个字符串
public User(Date date) {}
配置别名
第一种方式
第二种方式
导入其它配置文件
src/appContext-service.xml
bean的作用域
singleton
单例
Spring容器中的实例都默认单例
prototype
不会预初始化,每次都会创建一个新实例
request
对应Web应用request作用域
session
对应Web应用session作用域
application
对应Web应用application作用域
websocket
Scopes a single bean definition to the lifecycle of a WebSocket. Only valid in the context of a web-aware Spring ApplicationContext
globalSession
Scopes a single bean definition to the lifecycle of a global HTTP Session. Typically only valid when used in a Portlet context. Only valid in the context of a web-aware Spring ApplicationContext.
bean中获取Spring容器
public class User implements ApplicationContextAware{
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {}
}
p调用属性set方法赋值命名空间
在配置文件中增加一行 xmlns:p="http://www.springframework.org/schema/p"
public class User{
private String name;
private Date date;
getter/setter..
}
注意:
p:set方法名去掉前面的set后首字母小写=值(标量类型)
自动装配(bean的autowire属性)??????
说明
autowire 自动装配(有4种装配方式)
autowire-candidate 是否作为自动装配的候选者
byName
按名称自动装配
public class User{
private IdCard idCard;
getter/setter..
}
byType
按类型自动装配
public class User{
private IdCard idCard;
getter/setter..
}
constructor
按构造器自动装配,按照构造器中的形参的名字来选择bean的id名
public class User{
private IdCard idCard;
public User(IdCard idCard) {
this.idCard = idCard;
}
}
no
不自动装配
default
c调用构造器赋值属性命名空间
在配置文件中增加一行 xmlns:c="http://www.springframework.org/schema/c"
public class User{
private String name;
private Date date;
public User(String name,Date date){}
}
注意:
p:set方法名去掉前面的set后首字母小写=值(标量类型)
Bean创建的三种方式
第一种方式
构造器方式
第二种方式
调用静态工厂方法创建Bean
public class UserFactory {
public static User createUser(){
return new User();
}
}
第三种方式
调用实例工厂方法创建Bean
public class UserFactory {
public User createUser(){
return new User();
}
}
继承配置
配置文件
User.java
public class User{
private String name;
getter/setter..
}
注意:
1.会自动给User类的name属性赋值,因为父类不存在
2.父类Bean必须是一个抽象的Bean
Bean的生命周期
第一种方式
init-method 属性
初始化方法,创建对象时,会主动调用此方法
public void init(){}
destroy-method 属性
销毁方法,在对象销毁之前会执行此方法
public void destroy(){}
第二种方式
InitializingBean 接口
初始化接口
创建对象时,会主动调用此接口的方法
public class User implements InitializingBean{
@Override
public void afterPropertiesSet() throws Exception {}
}
DisposableBean 接口
销毁接口,在对象销毁之前会执行此接口的方法
public class User implements DisposableBean{
@Override
public void destroy() throws Exception {}
}
调用get方法(PropertyPathFactoryBean)
配置
User.java
public class User{
private String name;
get/set..
}
获取
String name = (String)context.getBean("getUsername");
Integer age = (Integer)context.getBean("getUserage");
配置
User.java
public class User{
public static final String TABLE = "user";
}
调用
String table = (String)context.getBean("table");
获取对象的属性(FieldRetrievingFactoryBean)
配置
User.java
public class User{
public String name;
}
获取
String name = (String)context.getBean("username");
注意:
用的很少,会破坏我们的封装,不匹配POJO原则
util命名空间
说明
IOC配置方式简化
基于Schema简化
引入
添加xmlns:util="http://www.springframework.org/schema/util" ,并且引入spring-util-4.2.xsd文件
标签
util:constant 简化访问静态的Field
util:property-path 简化get方法调用
util:list 配置List集合
util:set 配置Set集合
util:map 配置Map集合
util:properties 配置Properties集合
引入
util:constant
String table = (String)context.getBean("table");
util:property-path
String name = (String)context.getBean("name");
util:list
1122
public class User {
private List list;
public User(List list) {}
}
util:set
1122
public class User {
private Set set;
public User(Set set) {}
}
util:map
public class User {
private Map map;
public User(Map map) {}
}
util:properties
rootroot
public class User {
private Properties prop;
public User(Properties prop) {}
}
SpEL表达式
概述
Spring Expression Language
Spring表达式语言
API
ExpressionParser
Spring表达式解析器
EvaluationContext
Spring容器
运算表达式
ExpressionParser parser = new SpelExpressionParser();
//表达式
String str = "10+10";
//解析表达式
Expression expression = parser.parseExpression(str);
//得到结果
Object value = expression.getValue();
int value1 = expression.getValue(Integer.class);
字符串
String str = parser.parseExpression("Spring").getValue(String.class);
字符串长度
Object strlength = parser.parseExpression("'Spring'.bytes.length").getValue();
定义数组
String[] arr = (String[])parser.parseExpression("new String[]{'Spring','mybatis'}").getValue();
定义List集合
List
Spring资源访问
第一种方式:配置文件
单个文件
文件
src/db.properties
配置
User.java
public class User {
private Resource resource;
get/set..
}
多个文件
文件
src/db.properties 和 src/log.properties
配置
User.java
public class User {
private Resource[] resources;
}
第二种方式:代码
文件
src/db.properties
代码
Resource resource = new ClassPathResource("db.properties");
Resource resource = new FileSystemResource("D:\\workspace\\SpringTest\\src\\db.properties");
加载配置文件
属性占位符#{}
第一种方式(PropertySourcesPlaceholderConfigurer):
文件
src/db.properties(name=root)
配置
User.java
public class User {
private String name;
get/set..
}
多文件配置
第二种方式(配置)
配置中添加一行 xmlns:context="http://www.springframework.org/schema/context"
使用标签
属性重写
第一种方式
文件
src/db.properties(user.name=root)
配置
User.java
public class User {
private String name;
get/set..
}
多文件配置
第二种方式
配置中添加一行 xmlns:context="http://www.springframework.org/schema/context"
使用标签
package gaodai.matrix;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Sc
Asynchronous Http Client是android中非常好的异步请求工具
除了异步之外还有很多封装比如json的处理,cookie的处理
引用
Persistent Cookie Storage with PersistentCookieStore
This library also includes a PersistentCookieStore whi
安装Apache问题:系统找不到指定的文件 No installed service named "Apache2"
每次到这一步都很小心防它的端口冲突问题,结果,特意留出来的80端口就是不能用,烦。
解决方法确保几处:
1、停止IIS启动
2、把端口80改成其它 (譬如90,800,,,什么数字都好)
3、防火墙(关掉试试)
在运行处输入 cmd 回车,转到apa
问题描述:
MongoDB在非正常情况下关闭时,可能会导致索引文件破坏,造成数据在更新时没有反映到索引上。
解决方案:
使用脚本,重建MongoDB所有表的索引。
var names = db.getCollectionNames();
for( var i in names ){
var name = names[i];
print(name);
Zookeeper重载了几个构造函数,其中构造者可以提供参数最多,可定制性最多的构造函数是
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolea
本文转自:http://hatemysql.com/2010/06/29/select-into-outfile-access-deny%E9%97%AE%E9%A2%98/
为应用建立了rnd的帐号,专门为他们查询线上数据库用的,当然,只有他们上了生产网络以后才能连上数据库,安全方面我们还是很注意的,呵呵。
授权的语句如下:
grant select on armory.* to rn
<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
if (PHP_SAPI == 'cli')
die('This example should only be run from a Web Brows
1. I see. 我明白了。2. I quit! 我不干了!3. Let go! 放手!4. Me too. 我也是。5. My god! 天哪!6. No way! 不行!7. Come on. 来吧(赶快)8. Hold on. 等一等。9. I agree。 我同意。10. Not bad. 还不错。11. Not yet. 还没。12. See you. 再见。13. Shut up!
基本事务的使用:
从账户一的余额中转100到账户二的余额中去,如果账户二不存在或账户一中的余额不足100则整笔交易回滚
select * from account;
-- 创建一张账户表
create table account(
-- 账户ID
id number(3) not null,
-- 账户名称
nam