使用Spring
1 创建Maven Project
,添加spring-webmvc
依赖
2 复制applicationContext.xml
(Spring的配置文件)到项目中的src\main\resources
中
3 配置applicationContext.xml
4 在程序中,声明AbstractApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml")
,再调用ac
变量的getBean()
方法即可获取对象,最后,还应该调用ac
的close()
方法以释放资源。
Spring管理的对象
【理解】 作用域/单例
由Spring管理的对象默认情况下是单例的!也就是说,通过Spring反复获取同一个bean id的对象,都会是同一个对象!
在配置<bean>
时,添加scope
属性可以配置对象的作用域,当取值为singleton
时表示单例,当取值为prototype
时表示非单例。
如果是单例的,Spring会在加载配置文件时就创建对象,如果是非单例的,只会在getBean()
时创建对象。
【了解】 懒加载
当Spring管理的对象是单例的,可以配置它是否是懒汉式的单例模式,也就是懒加载。
默认情况下,并不是懒加载的!
可以在<bean>
节点中配置lazy-init="true"
将其设置为懒加载的!
【理解】 生命周期
学习生命周期的目的在于了解某个类当被创建出来之后,会在哪些时候被调用哪些方法,并且,作为开发者,需要确定如何重写这些方法,使得重写的代码会在正确的时候被执行。
由Spring管理的那些单例的对象也是可以确定生命周期方法的!
具体的做法是自行在类中创建初始化方法和销毁方法,方法的名称可以自定义。然后,在Spring的配置文件中,在<bean>
节点中添加init-method
属性和destroy-method
属性的配置,这2个属性的值都是自定义的方法的名称。
通过Spring为属性注入值
【理解】 通过SET方法注入值
在Spring的配置文件中,配置所需要创建对象的类,并配置需要注入值的<property>
节点:
<bean
id="userDao2"
class="cn.tedu.spring.UserDao2" />
<!-- property节点:配置属性的值 -->
<!-- property > name: -->
<!-- property > ref:引用哪个bean作为这个属性的值 -->
<bean
id="userService"
class="cn.tedu.spring.UserService">
<property
name="userDao"
ref="userDao2" />
</bean>
为需要注入值的属性添加set方法,这个方法可以通过Eclipse自动生成
注意:在Spring的配置文件中,注入值的节点的name属性的值,其实,应该是对应的属性的set方法名称,例如属性是userDao,set方法的名称是setUserDao,则配置的的name就是userDao,如果set方法的名称是setDao,则配置的的name就必须是dao。因为Spring的工作原理是基于的name属性值,获取到set方法的名称,然后调用set方法为属性注入值的!
【了解】 通过构造方法注入值
使用这种方式注入值之前,必须在类中声明为属性赋值的构造方法:
public UserController(
UserService userService) {
super();
this.userService = userService;
}
然后,在<bean>
节点下,添加<constructor-arg>
节点以配置构造方法的参数:
<bean
id="userController"
class="cn.tedu.spring.UserController">
<!-- index:参数的序号,从0开始编号 -->
<constructor-arg
index="0"
ref="userService" />
</bean>
关于value和ref
在配置属性的值时,如果属性的值是基本类型或String类型,则使用value
属性来配置,如果属性的值是其它对象型的数据,并且已经在Spring配置,则使用ref
属性来配置。
在配置value
时,还可以指定数据类型:
<property name="age">
<value type="int">23</value>
</property>
还可以为某个String类型的属性注入""
(空字符串)甚至null
(空值),但是,没什么意义。
小结:如果需要注入值的是基本类型或String,则在节点上配置name和value属性即可。
【了解】 注入List属性的值
<property name="listData">
<list>
<value>Alex</value>
<value>David</value>
<value>Lucy</value>
</list>
</property>
【了解】 注入Set属性的值
<property name="unorderedData">
<set>
<value>Beijing</value>
<value>Shanghai</value>
<value>Guangzhou</value>
</set>
</property>
【了解】 注入Map属性的值
<property name="session">
<map>
<entry key="username" value="admin" />
<entry key="password" value="123456" />
<entry key="group" value="administrator" />
</map>
</property>
【理解】 注入Properties属性的值
使用<util:properties>
节点就可以直接读取.properties
类型的配置文件:
<!-- util:properties用于读取.properties配置文件 -->
<!-- util:properties节点的本质也是一个bean节点 -->
<!-- id:bean id -->
<!-- location:配置文件的路径,以classpath:作为前缀 -->
<util:properties
id="dbConfig"
location="classpath:db.properties" />
然后,在为属性注入时,参考注入对象型的值的做法即可:
<property
name="dbConfig"
ref="dbConfig" />
关于ArrayList和LinkedList
ArrayList的特点:查询效率高,修改效率低
LinkedList的特点:查询效率低,修改效率高
遍历Map
调用Map对象的keySet()
方法,得到这个Map的所有的Key的Set集合,然后,再使用增强for循环或迭代器遍历这个Set集合,在遍历过程中,调用Map对象的get(? key)
方法获取对应的Value。