当某个Bean的某些属性值来自于另一个Bean的某些属性,则可以使用Spring表达式,例如:
public class ValueBean {// SampleBean中names的第3个值public String name;// SampleBean中session的frompublic String from;// SampleBean中config的driverpublic String driver;// ... 12345678910
则,首先,需要确定注入值的方式,例如通过SET方式注入,则需要为这些属性添加SET方法:
public void setName(String name) {this.name = name; } public void setFrom(String from) {this.from = from; } public void setDriver(String driver) {this.driver = driver; } 1234567891011
然后,在Spring的配置文件中进行配置:
<bean id="valueBean"class="cn.tedu.spring.ValueBean"><property name="name"value="#{sampleBean.names[2]}" /><property name="from"value="#{sampleBean.session.from}" /><property name="driver"value="#{sampleBean.config.driver}" /> </bean> 123456789
Spring表达式的基本语法格式是使用#{},其内部的编写方式取决于获取哪些值。
如果需要获取数组或List集合中的某个元素:
#{bean-id.数组或list集合名称[下标]} 1
如果需要获取Map或Properites中的某个元素:
#{bean-id.Map或Properties名.属性名} 1
也可以是:
#{bean-id.Map或Properties名['属性名']} 1 2. Spring自动装配(不推荐)
可以配置Spring中的<bean>节点中的autowire属性,使之尝试自动为其属性注入值,而不再需要使用<property>节点进行配置,减少配置的代码量。
该属性的取值可以是byName,表示将根据名称实现自动装配,要求被装配的属性有SET方法,且SET方法名称右侧的部分与某个bean的id是匹配的!
该属性的取值还可以是byType,表示将根据类型实现自动装配,即Spring会在容器管理范围之内查找类型匹配的对象,并尝试实现装配。
使用byType实现自动装配时,必须保证在Spring管理的范围之内,匹配类型的对象只有1个,如果超过1个,则程序会报错!
关于autowire属性还可以配置其它值,一般不关心这些问题。
并且,这种自动装配的做法其实是不推荐的!因为仅仅只使用autowire属性进行配置,某个类的哪些属性已装配、哪些属性未装配是不明确的!另外,自动装配会尝试为所有属性装配值,但是,也许某些属性是不希望被装配值的!
3. Spring注解 3.1. 通用注解如果某个类需要被Spring创建对象并进行管理,首先,应该在Spring的配置文件中添加组件扫描的配置,告诉Spring框架需要扫描哪个包中的类:
<!-- 组件扫描 --> <context:component-scanbase-package="cn.tedu.spring" /> 123
然后,确保那些需要被Spring创建对象并进行管理的类在这个包中,并在类的声明之前添加@Component注解即可:
package cn.tedu.spring; import org.springframework.stereotype.Component; @Component public class UserServlet { } 1234567
在单元测试中:
public class Tests {@Testpublic void test() {ClassPathXmlApplicationContext ac= new ClassPathXmlApplicationContext("spring.xml");UserServlet userServlet= ac.getBean("userServlet", UserServlet.class);System.out.println(userServlet);ac.close();} }
1234567891011121314151617以上组件扫描的配置中,配置的是需要扫描的根包,例如配置为cn.tedu.spring,则其子包cn.tedu.spring.dao也会在扫描范围之内!
被Spring管理的对象,默认使用的bean-id就是将类名的首字母转为小写的名称,例如类名是UserSerlvet,则它的bean-id就是userServlet,也可以在@Component注解中显式的配置bean-id:
@Component("servlet") public class UserServlet { } 123
与@Component相关的注解还有:@Controller通常添加在控制器类之前,@Service通常添加在业务类之前的,@Repository通常添加在处理持久层的类之前,它们的作用和使用方式是相同的!另外,@Component通常添加在其它定位的类之前。
3.2. 关于作用域和生命周期的注解(不常用)通过@Scope注解可以配置某个类的对象是否为单例,如果需要配置为非单例的,可以在类的声明之前:
@Scope("prototype") 1
如果需要是单例的,可以是@Scope("singleton"),或者@Scope,甚至完全不配置这个注解!
在类之前添加@Lazy注解可以设置为单例模式的懒汉单例。在@Lazy中也可以配置布尔值,例如@Lazy(false)表示非懒汉式,而@Lazy(true)表示懒汉式,但是,没有必要添加详细配置。
还可以通过@PostConstruct和@PreDestroy配置生命周期方法:
@PostConstruct public void init() {System.out.println("UserDao.init()"); } @PreDestroy public void destroy() {System.out.println("UserDao.destroy()"); } 123456789
注意:这2个注解是JavaEE中的注解,并不是Spring的注解,在使用之前,需要添加Tomcat运行环境,以导入JavaEE相关的jar包,才可以使用。
相关知识
Spring表达式和Spring注解
Spring
基于Spring Boot的宠物医院管理系统设计与实现
Spring Boot 日志
在 Spring Boot 中使用 Logback 和 Log4j2 记录日志
【精选】基于spring boot+vue的宠物管理系统(源码+定制+开发)Spring Boot宠物管理系统、Vue宠物管理平台、Spring Boot宠物平台设计、智能宠物管理平台开发
Spring Boot宠物医院管理系统设计与实现
如何优雅地记录操作日志?
基于Spring Boot的宠物领养系统开发教程及源码
宠物咖啡馆管理平台:Spring Boot+Vue+Mysql全功能实现
网址: Spring表达式和Spring注解 https://m.mcbbbk.com/newsview628742.html
上一篇: 答应男友出去玩=同意发生关系? |
下一篇: 吴恩达机器学习第五次作业(pyt |