Spring学习笔记
来源:互联网 发布:fastmsg 源码 编辑:程序博客网 时间:2024/06/03 21:22
1:inverse of control
使用spring工廠來控制生成bean
Xml: <bean name=”demoDao” class=””>
2: Bean實例化
2.1靜態工廠方法
Public class MyBeanFactory{
//自己工廠創建實例
Public static Bean createBean(){
Return new Bean();
}
Public class Bean{
}
Beans.xml:
<bean name=”bean” class=”com.linhaol.example.MyBeanFactory” factory-method=”creatBean”>
2.2
MyBeanFactory:
Public class MyBeanFactory{
Public MyBeanFactory(){
System.out.println(“bean create...”);
}
//自己工廠創建實例
Public static Bean createBean(){
Return new Bean();
}
}
Bean:
Public class Bean{
}
<bean name=”myBeanFactory” class=”com.linhao.example.MyBeanFactory”></bean>
<bean name=”bean” factory-bean=”myBeanFactory” factory-method=”createBean”></bean>
Test:
public void demo02(){
String xmlPath="com/linhao/example/beans.xml";
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);
BookService bookService=(BookService)applicationContext.getBean("bean");
bookService.addBook();
}
3.bean的實例化
默認是scope=singleton
<bean name=”bean” class=”com.linhao.example.Bean” scope=”prototype”></bean>
4.bean生命周期
設置bean作用
5.基於注解裝配bean(注冊@...+注入@Autowired)
5.1@Component有三個子類@Controller,@Service,@Repository
@controller(“userAction”)注解
@Service(“userService”)注解
@Repository(“userDao”)注解
5.2
5.2.1@Autowired//自動注入類類型
5.2.2@Qualifier(“userService”)//自動注入根據名稱
5.2.3@Resource與Autowired等價
3.報錯
代碼如下:
原因:將UserDaoImpl注冊為userDaoM時實現的接口是BookDao而不是UserDao,
在UserServiceImpl中注入的類型為UserDao類,這個類與BookDao并不是同一個類,所以報錯
解決方案:
將BookDao改爲UserDao后問題解決
7:Aop
Aspect、AspectJ
Joinpoint(所有方法)/PointCut(切入點)/Advice(增强)/Introduction(引介)/Weaving(置入),
將Advicd通知應用到切入點/Proxy(代理)/Aspect(切面)
UserDao
Save(),update(),delete();//Joinpoint
Update()//切入點
Weaving(置入)
MyAspect
Public void demo(){
//增强的内容,通知Ad
}
7.1Jdk Proxy
7.2 cglib代理:
cglib+asm
Enhancer /
7.2.1核心類
7.2.2確定
7.3spring工廠
MethodBeforeAdvice(目標方法執行前)
AfterReturningAdvice(關閉流,上傳文件刪除臨時文件等)
M
ProxyFactoryBean
Aopalliance
<bean id=”myAspect” class=””></bean>
<bean id=”studentDaoProxy” class=”ProxyFactoryBean>
<property name=”interfaces”></property>
</bean>
<property name=”interceptorNames” value=”myAspect”></property>
7.4AspectJ
7.4.1切入點表達式
常用Exection:
例如:
7.4.2Advice
7.4.3
7.4.3.1基於xml
Expression=”execution(* cn.it
7.4.3.2基於注解
@RunWith(SpringJ
@ContextConfiguration(“classpath:”);
@Aspect
@Before(“”)
Beans.xml
8:spring數據庫連接
Create database spring_one
/**/
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.execute(“create table t_user(id int primary key
auto_increment, username varchar(50),password varchar(32))”);
9:事務管理
Platformtran
Ctrl+O:查看類結構
money,outUser
money,inUser
c3p0-db.properties:
10 Spring切入点表达式常用写法
http://lavasoft.blog.51cto.com/62575/172292/
11. SpEL
11.1直接量表达式
ExpressionParser parser=new SpelExpressionParser();
//计算结果为”Hello World”
String helloWorld=parser.parserExpression(“’Hello World’”).getValue(String.class);
Double num=(Double)parser.parseExpression(“0.23”).getValue(Double.class);
11.2在表达式中创建数组
//创建一个ExpressionParser对象,用于解析表达式
ExpressionParser parser=new SpelExpressionParser();
//创建一个数组
Experssion exp=parser.parseExpression(“new String[]{‘java’,’Struts’,’Spring’}”);
System.out.println(exp.getValue());
//创建二维数组
Exp=parser.parseExpression(“new int[2][4]”);
System.out.println(exp.getValue());
11.3在表达式中创建List集合
SpEL直接使用如下语法创建List集合
{ele1,ele2,ele3}
ExpressionParser parser=new SpelExpressionParser();
//创建一个list集合
Expression exp=parser.parseExpression(“{‘java’,’Struts’,’Spring’}”);
System.out.prinntln(exp.getValue());
//创建二维“list”集合
exp = parser.parseExpression(“{{‘疯狂java’,’’},{‘左传’,’战国策’}}”);
System.out.println(exp.getValue());
11.4在表达式中访问List,Map
11.4.1 list[index]
List<Stirng> list=new ArrayList<String>();
list.add(“Java”);
list.add(“Sping”);
11.4.2 map[key]
Map<Stirng,Double> map=new HashMap<String,Double>();
map.put(“java”,80.0);
Map.put(“spring,89.0);
//创建一个ExpressionParser
ExpressionParser parser=new SpelExpressionParser();
EvaluationContext ctx=new StanddardEvaluationContext();
//设置两个变量
ctx.setVariable(“myList”, list);
ctx.setVariable(“myMap”,map);
//访问第二个元素
System.out.println(parser.parseExpression(“#myList[1]”).getValue(ctx));
//访问map集合指定元素
System.out.println(parser.parseExpression(“#myMap[‘java’]”).getValue(ctx));
11.5调用方法
ExpressionParser parser=new SpelExpressionParser();
EvaluationContext ctx=new StanddardEvaluationContext();
System.out.println(parser.parseExpression(“’HelloWorld’.substring(2,5)”).getValue();
List<String> list=new ArrayList<String>();
list.add(“java”);
list.add(“struts”);
list.add(“spring”);
list.add(“hibernate”);
//设置一个变量
Ctx.setVariable(“myList”,list);
System.out.println(parser.parseExpression(“#myList.subList(1,3)”).getValue(ctx));
11.6算术,比较,逻辑,赋值,三目等运算符
ExpressionParser parser=new SpelExpressionParser();
EvaluationContext ctx=new StanddardEvaluationContext();
List<String> list=new ArrayList<String>();
list.add(“java”);
list.add(“struts”);
list.add(“spring”);
list.add(“hibernate”);
//设置一个变量
Ctx.setVariable(“myList”,list);
//对集合的第一个元素赋值
Parser.parseExpression(“#myList[0]=’疯狂java讲义’”).getValue(ctx);
//下面输出疯狂java讲义
System.out.println(list.get(0));
//使用三目运算符
System.out.println(parser.parseExpression(“#myList.size()>3?”
+”’myList长度大于3’:’myList长度不大于3’”).getValue(ctx));
11.7 T(“abc”)把abc当作类来处理
ExpressionParser parser=new SpelExpressionParser();
//调用Math的静态方法
System.out.println(parser.parseExpression(“T(java.lang.Math).random()”).getValue());
//
System.out.println(parser.parseExpression(“T(System).getProperty(‘os.name’)”).getValue());
11.8调用构造器
ExpressionParser parser=new SpelExpressionParser();
//创建对象
System.out.println(parser.parseExpression(“new String(‘HelloWorld’).substring(2,4)”).getValue());
//创建对象
System.out.println(parser.parseExpression(“new javax.swing.JFrame(‘测试’)”
+”.setVisible(‘true’)”).getValue());
11.9安全导航操作
ExpressionParser parser=new SpelExpressionParser();
//使用安全操作,将输出null
System.out.println(parser.parseExpression(“#foo?.bar”).getValue());
//不使用安全操作,将报NullPointerExpression
System.out.println(parser.parseExpression(“#foo.bar”).getValue());
11.10集合选择
ExpressionParser parser=new SpelExpressionParser();
EvaluationContext ctx=new StanddardEvaluationContext();
List<String> list=new ArrayList<String>();
list.add(“java”);
list.add(“struts”);
list.add(“spring”);
list.add(“hibernate”);
//设置一个变量
ctx.setVariable(“myList”,list);
//判断集合元素length()方法的长度是否大于7
Expression exp=parser.parseExpression(“#myList.?[length()>7]”);
System.out.println(exp.getValue(ctx));
Map<String,Double> map=new HashMap<String ,Double>();
map.put(“java”,80.0);
Map.put(“spring,89.0);
map.put(“English”,80.0);
ctx.setVariable(“myMap”,map);
Expression exp=parser.parseExpression(“#myMap.?[value>80]”);
System.out.println(exp.getValue(ctx));
11.11集合投影 collection.![condition_expr]
ExpressionParser parser=new SpelExpressionParser();
EvaluationContext ctx=new StanddardEvaluationContext();
List<String> list=new ArrayList<String>();
list.add(“java”);
list.add(“struts”);
list.add(“spring”);
list.add(“hibernate”);
//设置一个变量
ctx.setVariable(“myList”,list);
//得到的新集合的元素是原集合的每个元素length()方法返回值
Expression exp=parser.parseExpression(“#myList.![length()]”);
System.out.println(exp.getValue(ctx));
List<Person> list2=new ArrayList<Person>();
list2.add(new Person(1, "孙悟空",162));
list2.add(new Person(2, "猪八戒", 182));
list2.add(new Person(3, "牛魔王", 195));
ctx.setVariable(“myList2”,list2);
//得到的新集合是原集合每个元素的name属性值
exp=parser.parseExpression(“#myList21.![name]”);
System.out.println(exp.getValue(ctx));
11.12表达式模板
ExpressionParser parser=new SpelExpressionParser();
Person p1= new Person(1, "孙悟空",162);
Person p2= new Person(2, "猪八戒", 182);
Expression expr=parser.parseExpression(“我的名字是#{name},身高是#{height},new TemplateParserContext());
//将使用p1对象name、height填充上面表达式模板中的#{}
System.out.println(expr.getValue(p1));
//将使用p2对象name、height填充上面表达式模板中的#{}
System.out.println(expr.getValue(p2));
12:Annotation
12.1指定作用域
//指定该Bean实例的作用域为prototype
@Scope(“prototype”)
//指定该类作为Spring Bean,Bean实例名为axe
@Component(“axe”)
Public class SteelAxe implements Axe{
}
12.2@Resource配置依赖
12.3@DependsOn和@Lazy
@Lazy(true)//不会预初始化Chinese Bean
@DependsOn({“steelAxe”,”abc”}) //初始化Chinese之前会强制初始化steelBean,abc这两个bean
@Component
Public class Chinese implements Person{
}
12.4资源访问
策略模式:
Resource接口
12.4.1 UrlResource(访问网络资源的)
12.4.2 ClassPathResource(访问类加载路径里资源的实现类)
12.4.3 FileSystemResource(访问文件系统资源)
12.4.4 ServeltContextResource(访问相对于ServeltContext路径里的资源)
String realPath = getRealPath(“book.xml”)获取资源文件的绝对路径
File file=new File(realPath+”/book.xml”);
报错:???
12.4.5 InputStreamResource(访问输入流资源)
12.4.6 ByteArrayResource(访问字节数组资源)
12.4.7绝对路径访问资源文件
12.4.7.1
文件必须放在源包中
String path = ResourceAwareTest.class.getClassLoader().getResource("").getPath();
System.out.println("path = " + path);
//获取bean.xml以及获取资源文件book.xml
ApplicationContext ctx = new FileSystemXmlApplicationContext(path + "/bean.xml");
Resource res = ctx.getResource(path + "/book.xml");
12.4.7.2
文件必须放在源包中
ApplicationContext ctx = new FileSystemXmlApplicationContext(“classpath:bean.xml”);
Resource res = ctx.getResource(“classpath:book.xml”");
12.4.7.3
文件必须相对于应用
ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
Resource res = ctx.getResource("book.xml");
12.4.8类路径获取资源文件
//获取bean.xml以及获取资源文件book.xml
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
Resource res = ctx.getResource(path + "/book.xml");
12.4.9 classpath*:前缀
13 AspectJ切入点表达式
http://blog.csdn.net/lk7688535/article/details/51989746
14 Spring Aop切入点提示符
http://blog.csdn.net/caomiao2006/article/details/51287204
Execution:
14.1 within(匹配特定类型):
within(org.crazyit.app.service.*)、within(org.crazyit.app.service..*);
14.2 this(限定AOP代理):
匹配实现了AccountService接口的代理对象
this(org.crazyit.app.service.AccountService);
14.3 target(限定目标对象):
target(org.crazyit.app.service.AccountService)
14.4 args(限制连接点的参数类型)
args(java.io.Servializable)
14.5
//匹配任意public方法
Execution(public * * (..))
//匹配任何方法名以”set”开始的方法的执行
Execution(* set* (..))
//匹配AccountService里定义的任意方法的执行
Execution(* org.crazyit.app.service.AccountService.*(..))
//匹配service包任意类的任意方法的执行
Execution(* org.crazyit.app.service.*.*(..))
14.6 bean
明确指定Spring的哪个Bean织入增强处理
//匹配tradeService Bean实例中方法执行的连接点
bean(tradeService)
//匹配名字以Service结尾的Bean实例内方法执行的连接点
bean(*Service)
14.7 组合切入点表达式
14.7.1 &&(and?)
同时匹配两个表达式
14.7.2 ||(or?)
匹配任意一个表达式
14.7.3 !:(not?)
不匹配表达式
15 Spring支持的事务策略=(编程式事务+声明式事务)
15.1 JTA全局事务?底层应用服务器
JdbcTemplate???
15.2 JDBC局部事务?
事务传播规则:
PROPAGETION_MANDATORY、PROPAGATION_NESTED、PROPAGATION_NEVER、PROPAGATION_NOT_SUPPORTED、PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_SUPPORTS
15.3 Hibernate事务?
15.4 使用TransactionProxyFactoryBean创建事务代理
面向接口编程,整合CGLIB??
16. 配置advice
<tx:advice>
http://blog.csdn.net/zh123456zh789/article/details/60581212
<!--配置两个事务增强管理-->
<tx:advice id=”defaultTxadvice”>
<tx:attributes>
<tx:method name=”get*” read-only=”true”/>
<tx:method name=”*”/>
</tx:attributes>
</tx:advice>
<tx:advice id=”noTxAdvice”>
<tx:attributes>
<tx:method name=”*” propagation=”NEVER”/>
</tx:attributes>
</tx:advice>
<aop:config>
<!--配置一个切入点,匹配userService Bean的所有方法执行-->
<aop:pointcut id=”txOperation” expression=”bean(userService)”/>
<!--配置一个切入点,匹配org.crazyit.app.service包下所有以Manager结尾的类的所有方法的执行-->
<aop:pointcut id=”noTxOperation” expression=”execution(* org.crazyit.app.service.*Manager.*(..))”/>
<!--将txOperation切入点和defaultTxAdvice切面绑定在一起-->
<aop:advisor pointcut-ref=”txOperation” advice-ref=”defaultTxAdvice”/>
<!--将noTxOperation切入点和noTxAdvice切面绑定在一起-->
<aop:advisor pointcut-ref=”noTxOperation” advice-ref=”noTxAdvice”/>
</aop:config>
<!--配置业务逻辑bean-->
....
16 使用@Transactional
修饰类名或方法名
17. Spring整合Struts2
17.1启动Spring容器
ContextLoaderListener
<web.xml>:
<web-app xmlns=...>
<!--使用ContextLoaderListener初始化Spring容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--指定多个配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml</param-value>
</context-param>
</web-app>
//获取当前Web应用的Spring容器
WebApplicationContext ctx=WebApplicationContextUtils.getWebApplicationContext(servletContext);
17.2让Spring管理控制器
- spring gossip(spring 学习笔记)
- spring学习笔记: Spring AOP
- spring学习笔记: Spring Jdbc
- spring学习笔记:spring事务管理
- spring学习笔记:spring事务管理
- spring学习笔记:spring controller
- spring学习笔记:spring事务管理
- Spring 学习笔记:浅谈 Spring
- spring学习笔记: Spring AOP
- Spring学习笔记-Spring容器
- Spring学习笔记 - Spring Data
- Spring学习笔记-Spring Cache
- Spring学习笔记 - Spring Boot
- Spring学习笔记: Spring概述
- Spring 学习笔记
- Spring学习笔记
- Spring AOP学习笔记
- Spring学习笔记(一)
- Andrew NG 机器学习 练习8-Anomaly Detection and Recommender Systems
- 新建一个Vue项目需要做的
- js数组,循环,闭包问题
- 二叉树三种遍历(递归的妙用)
- 05_RxJava与RxAndroid
- Spring学习笔记
- AI行业者必看!领先时代的智能资讯机器人步步逼近!
- 机器学习第一章
- logback与Spring、SpringMVC结合使用教程
- python 里面的单下划线与双下划线的区别(私有和保护)
- php解决插入数据时mysql对json_encode值的反斜杠进行转义
- C结构体做函数参数
- 问题 B: Hello World for U
- Tensorflow常用基本概念与函数