第3章 装配Bean---高级装配--笔记3

来源:互联网 发布:淘宝逆战解封 编辑:程序博客网 时间:2024/06/10 21:23

概述:

Spring一些高级特性

  • Spring profile : 让bean活起来
  • 条件化的bean声明:过滤bean 
  • 自动装配与歧义性: 请给我一个精准的bean
  • bean的作用域:  正确行使的权利
  • SpringEL表达式: Spring自己的语言

SpringEL表达式 --减少硬编码

提供两种方式:

属性占位(Property placeholder)

Spring表达式语言(SpEL)

1.占位符进行注入

package learn.chapter3.javaConfig;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.core.env.Environment;import learn.chapter2.BlankDisc;@Configuration@PropertySource("classpath:app.properties")public class ExpressiveConfig {@AutowiredEnvironment env;@Beanpublic BlankDisc disc(){return new BlankDisc(env.getProperty("disc.title"),env.getProperty("disc.artist"));}}
总结:主要是注解@PropertySource("配置文件的路径"), 配置文件的属性将会注入到Environment


app.properties文件

disc.title=hellodisc.artist=adele

package learn.chapter3;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import learn.chapter2.BlankDisc;import learn.chapter3.javaConfig.ExpressiveConfig;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes={ExpressiveConfig.class})public class ConditionTest2 {@Autowiredprivate BlankDisc blankDisc;@Testpublic void getPropertyValue(){System.out.println(blankDisc.toString());;}}

package learn.chapter2;import java.util.List;public class BlankDisc implements CompactDisc {private String title;private String artist;private List<String> tracks;public BlankDisc(String title, String artist) {super();this.title = title;this.artist = artist;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getArtist() {return artist;}public void setArtist(String artist) {this.artist = artist;}public List<String> getTracks() {return tracks;}public void setTracks(List<String> tracks) {this.tracks = tracks;}@Overridepublic String toString() {return "BlankDisc [title=" + title + ", artist=" + artist + ", tracks=" + tracks + "]";}public void play() {System.out.println("专辑为" + title + "\t 歌手为:" + artist);if(null!=tracks && tracks.size() > 0){for (String track : tracks){System.out.println("---磁道: " + track);}}}}

结果为:

BlankDisc [title=hello, artist=adele, tracks=null]

深入学习Spring的Enviroment

environment提供默认值和类型转换功能

@Bean
public BlankDisc disc(){
return new BlankDisc(
env.getProperty("disc.title", "海阔天空"),
env.getProperty("disc.artist", "beyond")
);
}

<T> T getProperty(String key, Class<T> targetType, T defaultValue);

targetType就是目标类,defaultValue:默认值

例如:

int connectionCount = env.getProperty("db.connection.count", Integer.class, 30);  //转为为Integer,默认值为30

如果要某个属性必须要输入

env.getRequiredProperty();方法

env.containsProperty() 判断是否存在对应的属性;

env.getPropertyAsClass() 将属性解析成一个类 已经被废弃了

String[] getActiveProfiles() 返回激活profile名称的数组

String[] getDefaultProfiles() 返回默认profile名称的数组

boolean acceptsProfiles(String ... profiles) 如果environment支持给定的profile的话,就返回true


在xml中可以通过${disc.title} 引用属性

也可以通过注解@Value将配置文件属性注入变量中

public BlankDisc(@Value("${disc.title}") String title,
@Value("${disc.artist}") String artist){
this.title = title;
this.artist = artist
}

为了使用占位符的特性,注入一个解析类

@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}

这个是遇见最长的java类,哈哈

如果xml配置文件需要加上

<context:property-placeholder/>


2.SpEL拥有很多特性,包括:

  • 使用bean的ID来引用bean
  • 调用方法和访问对象的属性
  • 对值进行算术、关系和逻辑运算
  • 正则表达式匹配
  • 集合操作。

这个需要细细研究才行。。。。。。。未完待续

原创粉丝点击