学习spring-day03

【理解】 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.daocn.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>idclass即可,适用于这个类存在无参数的构造方法。

掌握通过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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值