Spring学习笔记

来源:互联网 发布:fastmsg 源码 编辑:程序博客网 时间:2024/06/03 21:22

1inverse 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@ResourceAutowired等價

3.報錯

 

 

代碼如下:

 

 

 

原因:將UserDaoImpl注冊為userDaoM時實現的接口是BookDao而不是UserDao

UserServiceImpl中注入的類型為UserDao類,這個類與BookDao并不是同一個類,所以報錯

 

解決方案:

 

BookDao改爲UserDao后問題解決

7Aop

AspectAspectJ

 

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在表达式中访问ListMap

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对象nameheight填充上面表达式模板中的#{}

System.out.println(expr.getValue(p1));

//将使用p2对象nameheight填充上面表达式模板中的#{}

System.out.println(expr.getValue(p2));

 

12Annotation

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接口的代理对象

thisorg.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_MANDATORYPROPAGATION_NESTEDPROPAGATION_NEVERPROPAGATION_NOT_SUPPORTEDPROPAGATION_REQUIREDPROPAGATION_REQUIRES_NEWPROPAGATION_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.2Spring管理控制器




原创粉丝点击