【理解】 Spring表达式
使用Spring表达式,可以在配置Spring时,获取另一个bean的某个属性的值!
Spring表达式的基本语法格式为:
#{bean的id.属性名}
配置时,将Spring表达式作为某个<property>
节点的value
属性的值即可。
如果通过Spring表达式访问的是另一个bean的List类型或数组类型的属性中的某个元素,则使用的语法:
#{bean的id.List集合的名称/数组的名称[索引/下标]}
如果通过Spring表达式访问的是另一个bean的Map类型或Properties类型的属性中的某个元素,则使用的语法:
#{bean的id.Map的名称/Properties的名称.key}
也可以是(不推荐):
#{bean的id.Map的名称/Properties的名称.['key']}
另:Spring表达式是基于ONGL表达式的!
【了解】 自动装配(Autowire)
自动装配表示Spring可以为Bean中的属性自动注入值!不必再去配置各个<bean>
节点下的<property>
子节点!例如:
<bean id="userService"
class="cn.tedu.spring.UserService"
autowire="byName" />
使用自动装配时,在<bean>
节点中添加autowire
属性,当取值为byName
时,表示根据名称来装配,以上述代码为例,当Spring创建UserService
的对象时,会检索UserService
中有哪些属性,则找到了名为userDao
的属性,然后,Spring会在它管理的那些bean中找某个id也叫做userDao
的,如果找到,就自动注入值,如果找不到,也不会报错,只是不会为这个属性注入值而已。
配置的autowire
属性的值还可以是byType
,表示的意思是根据类型进行匹配,当找到匹配类型的bean时,就会为属性注入值!注意:根据类型匹配时,必须保证最多只匹配1个,如果有多个都匹配这个类型,会导致异常!!!
小结:使用自动装配虽然方便,但是,有很多属性注入的值并不是Spring管理的bean,则这些属性是无法通过自动装配来注入的!而且,一旦使用了自动装配,就会存在属性是否被注入值表现得不明确的问题,也就是,哪个属性成功的注入了值,而哪个属性没有被注入值,这个问题是表现得不清楚的!甚至,各个对象之间的依赖关系也表现得不明确!
小结:关于自动装配,重在理解byName和byType的特性!不需要掌握这种配置的做法!
【重要】 使用注解
组件扫描
使用组件扫描可以不必在Spring的配置文件中配置各个<bean>
节点:
<context:component-scan
base-package="cn.tedu.spring" />
base-package
表示需要扫描的根包,当配置以后,Spring会自动扫描根包下所有的类,以及各层级的子包中的所有的类!例如配置的值是cn.tedu.spring
时,会扫描这个包下所有的类,甚至cn.tedu.spring.dao
、cn.tedu.spring.service
这些子包下的类!
组件扫描的目的是让Spring知道有哪些类,事实上,只是配置了组件扫描,Spring并不会创建这些类的对象!如果需要Spring创建某些类的对象,还需要为这些类添加注解!
常用注解
在Spring中,可以为类添加注解:
@Component
当同时配置了组件扫描和注解后,Spring就会创建这些类的对象!
Spring创建类的对象时,默认使用的bean id是将类名的首字母改为小写,例如类名是UserDao
,则默认的bean id就是userDao
,如果需要自定义名称,可以在注解上添加配置,例如:
@Component("dao")
在Spring中,对类的注解,常用的有:
@Component 通用注解(推荐)
@Named 通用注解(不推荐)
@Controller 推荐用于对控制器类进行注解
@Service 推荐用于对业务逻辑类进行注解
@Repository 推荐用于对持久层处理的类进行注解
以上5种注解是等效的!只是语义不同!
【了解】 其它对类的注解
使用@Scope
可以对类进行注解,这个注解等效于此前在<bean>
节点中配置的scope
属性,例如:
@Repository("userDao")
@Scope("prototype")
public class UserDaoImpl { ...
以上2个注解在编写代码时不用考虑先后顺序的问题。
如果需要配置某个类是懒汉式加载,可以使用@Lazy(true)
注解,例如:
@Repository("userDao")
@Scope("singleton")
@Lazy(true)
public class UserDaoImpl { ...
使用@PostConstruct
和@PreDestroy
这2个注解可以标记类中的生命周期方法:
@PostConstruct
public void init() {
System.out.println("UserDaoImpl.init()");
}
@PreDestroy
public void destroy() {
System.out.println("UserDaoImpl.destroy()");
}
注意:以上注解中,@Scope和@Lazy是对类注解,而@PostConstructor和@PreDestroy是对方法注解。
注意:@PostConstructor和@PreDestroy是Tomcat环境中的,所以,使用之前,必须对项目配置Tomcat Runtime!
注意:如果导入别人的项目,应该先检查Tomcat Rumtime,避免各台电脑的Tomcat不一致所产生的问题。
【了解】 关于@Autowired和@Qualifier
使用@Autowired
和@Qualifier
可以实现对类的属性进行自动装配,例如:
@Autowired
@Qualifier("userDao")
private UserDaoImpl userDao;
【重要】 关于@Resource
使用@Resource
注解可以取代@Autowired
和@Qualifier
。
使用的基本格式是:
@Resource
private UserDaoImpl userDaoImpl;
添加以上注解后,Spring会根据属性的名称userDaoImpl
作为bean id进行检索,查找匹配的bean,找到后为这个属性注入值。
但是,如果需要注入值的类的bean id无法匹配,例如:
@Repository("userDao")
public class UserDaoImpl { ...
则属性名称userDaoImpl
与bean id为userDao
匹配不上,则可以在@Resource
注解中显式的指定bean id:
@Resource(name="userDao")
private UserDaoImpl userDaoImpl;
@Resource
注解的注入方式是直接对属性赋值,并不是通过SET方法注入的,所以,使用@Resource
注解的那些属性并不需要SET方法!
@Resource
注解是优先byName
来注入的,如果无法注入,会尝试byType
。
小结:当需要为某个属性注入值时,添加@Resource注解,同时,请保证属性的名称与对应的bean id是一致的!
关于Spring的总结
作用
Spring是一个容器,可以用于创建对象,甚至在创建对象时,为其中的某些属性直接注入值!开发者在编写程序时,从Spring容器中获取所需的对象就可以了,无须再自行创建对象(不用new)!
由于开发者不必须再自行创建对象,所以,可以减少对象之间的依赖,使得整个项目更加易于管理和维护!
关于IOC和DI
IOC:不用自己new对象,而是由框架去创建,自己只需要获取就可以了
DI:注入属性的值,例如UserService中有UserDao类型的属性,DI的具体表现就是不需要为这个属性显式的赋值,通过Spring的配置或注解就可以使得这个属性有值!
IOC是Spring框架所实现的目标,而DI是实现这个目标所使用的手段,也就是Spring通过DI实现了IOC。
掌握的基本配置
在Spring的配置文件中,配置<bean>
的id
和class
即可,适用于这个类存在无参数的构造方法。
掌握通过SET方式注入属性值的做法,例如:
<bean id="xx" class="xx">
<property name="xx" ref="xx" />
</bean>
之所以需要掌握这种配置,是因为后续的应用中,可能需要使用到Spring MVC或其它框架中的类,并且配置上自定义一些值,无法通过注解来注入值,只能通过XML文件去配置!
而其它的相关的知识点还有:
- 通过静态工厂方法配置bean
- 通过实例工厂方法配置bean
- 单例和非单例
- 懒加载
- 生命周期方法
- 通过构造方法注入属性的值
以上这些并不是常用做法,所以,至少保持在了解层次,但是,也不需要太深入!
掌握Spring表达式的用法
Spring表达式的作用是获取另一个bean的某个属性的值。
Spring表达式的基本语法:#{bean的id.属性名}
或#{bean的id.List或Array名[下标]}
或#{bean的id.Map或Properties名.key}
请知道Spring表达式是基于ONGL的,有空的时候学习一下ONGL是有好处的!
掌握通过Spring读取properties文件
在Spring的配置文件中,添加<util:properties>
节点即可读取.properties
文件,配置示例:
<util:properties id="xx"
location="classpath:文件路径" />
使用的.properties
文件应该存放于项目的src\main\resources
下,例如路径为src\main\resources\db.properties
时,应该配置为:
<util:properties id="xx"
location="classpath:db.properties" />
如果路径为src\main\resources\conf\db.properties
时,应该配置为:
<util:properties id="xx"
location="classpath:conf/db.properties" />
关于注解
首先,学会配置组件扫描,重点在于把Spring的配置写在不同的文件中去,并且,扫描时,只扫描固定的几个包,不要扫描项目中所有的包!
然后,掌握一些常用注解的用法,包括:
@Component
@Controller
@Service
@Repository
@Resource
[Tomcat]
以上注解,除了需要知道在哪里用,还得知道注解的详细配置,例如@Component("bean_id")
、@Resource(name="bean_id")
其它注解并不常用,了解即可:
@Named
@Scope
@Lazy
@PostConstructor
[Tomcat]@PreDestroy
[Tomcat]@Autowired
@Qualifier
关于可变参数
可变参数,表现为方法的参数的数量可以是若干个,最少为0个,编写可变的方法例如:
public void sum(int... numbers)
在实现该方法的功能时,请将可变参数作为匹配类型的数组来处理,即int...
的参数其实就是int
类型的数组。
每个方法中最多只能有1个可变参数,而且,可变参数必须是该方法的最后一个参数!
http://schema.tedu.cn/proxy/