Spring笔记

重点:如果类中没有setter方法,则无法在配置文件里面使用<property>进行属性内容的设置。
1.在测试类的上面写上

  @ContextConfiguration(locations = {"classpath:spring/spring-base.xml"})。        

===============================下面是Spring表达式(SpEL)==================================================
2.<bean id="message" class="com.ytinf.service.IMessageService" abstract="true"/>
<bean id="messageService" class="com.ytinf.service.impl.MessageServiceImpl" parent="message"/>。
3.在Spring里面布尔数据类型的取值一般有如下几种:0或1,off或on,true或false,yes或no。
4.使用property标签设置内容,相当于采用setter方法赋值

1 <property name="empno" value="7369"/>
2 <property name="ename" value="SMITH"/>
3 <property name="salary" value="899.23"/>
4 <property name="age" value="30"/>
5 <property name="hiredate" >
6 <bean class="java.util.Date"/><!--调用无参构造-->
7 </property>
8 <property name="dept" ref="dept"/>
9 </bean>

5.通过p命名空间设置内容。操作的结构有两种形式:
● 直接进行内容的设置,格式为:“p:属性=内容”;
● 引用其他的Bean,格式为“p:属性-ref=Bean名称”;
6.集合对象的注入:在Spring中,集合的数据类型主要分为:List,Set,Map,Properties。
    强调:在Spring中,数组和List是对等关系。
7.注入数组(Array):引入类的时候用ref,引入数值的时候用value。
8.注入List集合:只需要将数组中的“Array”标签改成“list”标签即可(注意list标签的“l”是小写的);
9.在Set接口里面HashSet依靠的是equals()和hashCode()两个方法区分重复,而TreeSet依靠的是Comparable接口区分重复。
10.注入Set集合:要在emp类中覆写equals()和hashCode()方法。
采用 <map>
<entry key="雇员-A" value-ref="empA"/>
<entry key="雇员-B" value-ref="empB"/>
<entry key="雇员-C" value-ref="empC"/>
</map>
使用如下方法输出Map集合:

1 for(Map.Entry<String,Emp> entry:this.dept.getEmps().entrySet()){
2 System.out.println(entry.getKey()+"="+entry.getValue());
3 }
4 System.out.println("List子类:"+this.dept.getEmps().getClass());


11.注入Properties集合:在java。util包里面Properties描述的是属性的操作,而Properties本身是Hashtable的子类,但是与Map最大
的区别在于Properties主要保存字符串型的数据。
<property name="projects" >
<props>
<prop key="crm" >客户关系管理系统</prop>
<prop key="erp" >企业资源管理系统</prop>
<prop key="drp" >企业销售管理系统</prop>
</props>
</property>
执行程序:
System.out.println(this.dept.getProjects().getProperty("hello"));//执行结果:null
//设置了key不存在的默认值
System.out.println(this.dept.getProjects().getProperty("hello","not fund project"));//执行结果:not fund project
12.构造方法注入:以上的注入类型都是通过了setter方法进行了对象内容的注入管理,在实际使用过程中也可以针对构造方法进行内容传递。
13.构造方法注入规则:<bean id="dept" class="com.ytinf.vo.Dept">
<constructor-arg value="10"/> //设置构造方法的第一个参数
<constructor-arg value="财务部"/> //设置构造方法的第二个参数
</bean>
14.也可以通过索引(index)的方式打乱构造方法参数的输入顺序:索引从0开始,以下的方式和13意义相同
<bean id="dept" class="com.ytinf.vo.Dept">
<constructor-arg index="1" value="财务部"/>
<constructor-arg index="0" value="10"/>
</bean>
15.也可以通过直接设置名称的方式:<bean id="dept" class="com.ytinf.vo.Dept">
<constructor-arg name="dname" value="财务部"/>
<constructor-arg name="deptno" value="10"/>
</bean>
16.也可以通过使用别名的方式设置参数:
17.自动装配:在配置文件里面进行不同实例的引用关联传统方式是使用<ref>,为了简化以后可以不用关联,
采用自动装配的方式实现(只需加上autowire="byType");下面例子是emp关联dept
如: <bean id="emp" class="com.ytinf.vo.Emp" autowire="byType">//根据类型自动引用。
18.假设现在有两个部门信息,则采用byType就不行了,这时可以采用autowire="byName"//根据名称自动引用
如:<bean id="emp" class="com.ytinf.vo.Emp" autowire="byName">,匹配名称:当属性名称和bean名称相同,则可以自动注入操作
19.自动装配并取消候选资格,在前面选择好实用类型匹配时,
再在后面不需要的Bean上加上autowire-candidate="false";//取消候选资格。
20.Bean实例化管理:当容器启动的时候才会进行对象的初始化(实例化对象)
21.在整个Spring容器中,任何进行的<bean>配置实际上都采用了单例设计模式,即只提供有一个实例化对象。
22.默认情况下所有的bean都隐藏了一个单例的配置属性:scope="singleton";如果此时想取消scope属性配置:只需加上scope="prototype"即可
23.Spring默认的单例为饿汉式,如果想配置懒汉式单例设计模式,只需加上scope="singleton" lazy-init="true"即可;
24.Bean的初始化与销毁:在bean中添加两个属性 init-method="初始化方法名称" destroy-method="销毁方法名称";
除了需要设置这两个属性之外还要在类中进行设置,具体见笔记(依赖注入下)。
25.路径通配符:“?”表示匹配零位或一位的任意字符,如:spring?.xml将匹配spring1.xml,spring2.xml等文件;
“*”表示匹配零位,一位或多位的任意字符,例如spring-*.xml,可以匹配spring-base.xml,spring-datasource.xml等文件;
“**”表示匹配任意路径的名称。

26."#{'hello'+'world'}","#{true}","#{3.14E10}","#{null}","#{1+2*3-5}","#{5.5^2}","#{10 div 2}",
"#{2 eq 2}","#{2 ne 3}","#{5 gt 3}","#{5 ge 5}","#{3 lt 5}","#{3 le 3}","#{3 BETWEEN{1,5}}";
27. "#{1==2 && 10 div 0==0}",&&(and),||(or),!(not);
28. 三目运算符:"#{3 gt 1 ? 'hello':'world'}","#{null eq null 'hello':'world'}";
29.字符串表达式:"#{'helloworld[0]'}",执行结果为 h ;字符串转大写:"#{'hello'.toUpperCase()}";
字符串内容替换:"#{'h111111e222ll666o'.replaceAll('\\d+','')}",执行结果:hello;
30.正则匹配:"#{'hello'.matches '\\w+'}",执行结果:true;
31.Class表达式:(1)获取Class对象:"#{T(java.util.Date)}";执行结果:class java.util.Date;
(2)Class对象调用静态方法:"#{T(java.lang.Integer).parseInt('250')}",执行结果:250;
(3)Class对象调用静态属性:"#{T(java.lana.Integer).MAX_VALUE}",执行结果:2147483647;
(4)直接通过反射获取类中的实例化对象:"#{new java.util.Date()}",获得当前时间;
(5)判断某一个对象是否为指定类的实例(instanceof):"#{'hello' instanceof T(java.lang.String)}",执行结果:true;
32.表达式变量操作:所有的变量一定要使用“#”进行声明:(1) "#{#var1+#var2}",var1和var2都是变量,下文 需要用setVariable()方法设置变量值;
(2)也可以在创建EvaluationContext对象的时候直接指派值,具体构造方法见笔记,调用的时候用“#root”代替此值,
如:"#{#root eq 10 '获得满分成绩':'革命尚未成功,同志仍需努力!'}";
(3)也可以进行方法的引用,别名先利用反射获得方法名称,再为方法设置一个别名,再调用方法别名:"#{#myInt('250')}";
(4)"#{time}",相当于getTime(),下面需要获得此方法的对象;
32.定义List集合:"#{{'黑娃娃','瓷娃娃','白娃娃'}}",此时返回的List实例类型为:java.util.Collections.UnmodifiableRandomAccessList提供的一个List实现类,此类的最大特点是无法进行List集合内容的修改;
(1)在Spring里面,List和数组属于等价的关系;
(2)通过索引的方式获得集合的内容:"#{#allData[1]}",获取索引为1的元素内容;
(3)修改List集合内容:"#{#allData.!['XB黑胖纸'+#this]}","![]"表示在全部的内容前面都加上“XB黑胖纸”。
33.定义Map集合:"#{#allData['黑娃娃']='一个确实很黑的胖纸,而且属于饿汉式代表'}",allData是一个Map类型的变量,下面为其设置内容;
修改Map集合的内容:"#{#allData.!['hello' + #this.value]}",表示在所有的value前面都加上hello。
34.表达式注入:如:<bean id="item" class="cn.mldn.vo.member">
<property name="title" value="#{'小李老师'.substring(0,2)}">
</bean>
35.基于Annotation使用SpEl:
如():xml配置文件:<bean id="item" class="cn.mldn.vo.item">中间省略下面三个属性</bean>
public class Dept implements Serializable{
@Value("#{item.creatention?.time}")//表示将创建日期的时间数字作为部门编号
private Long deptno;
@Value("#{item.title +'多可爱的部门'}")
private String dname;
@Value("#{item.contents[1]}")
private String bussiness;

}。
==========================================结束===================================================
36.Spring注解:(1) @bean;(2) @Scheduled;
37.定时调度(基于Annotation配置SpringTask):xml配置文件:<task:annotation-driven/>(1).修改spring-base.xml,追加<task:annotation-driven/>
所有的任务都应该在Mytask类中完成,直接在这个类里面加入相应的注解即可。
如(此时只启动一个定时任务):public class MyTask {
private SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
@Scheduled(fixedRate = 1000)//每秒打印一次,一定要设置@Scheduled注解
public void runJob(){
System.out.println("【当前的日期时间】"+this.sdf.format(new Date()));
}
}
又如(此时只启动一个定时任务):public class MyTask {
private SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
@Scheduled(cron = "******?") //每秒打印一次
public void runJob(){
System.out.println("【当前的日期时间】"+this.sdf.format(new Date()));
}
}
38.启动多个定时任务:需要使用到线程池,xml配置文件:<task:annotation-driven/>
<task:scheduler id="scheduler" pool-size="3"/>//创建3个大小的线程池,可以同时有三个定时任务并行执行。
39.启动Spring容器:
public class 类名称{
public static void main(String args[]){
new ClassPathXmlApplicationContext("classpath:spring/spring-base.xml");
}
}

posted @ 2019-06-16 13:29  王兴龙123  阅读(95)  评论(0)    收藏  举报