如何访问单例并在 java 中命名?
How to access a singleton and name it in java?
我想在 Java 中创建一个单例,它需要从文件配置中读取以实例化,以及其他逻辑(因此它不仅仅是一个新的 MySingletonObject())。
在 Spring 中实现该目标的正确方法是什么?我想知道我是否应该执行以下操作:
public interface MySingletonObjectAccessor {
MySingletonObject getInstance();
}
@Service
public class MySingletonObjectAccessorImpl implements MySingletonObjectAccessor {
private MySingletonObject mySingletonObject;
@Override
public MySingletonObject getInstance() {
return mySingletonObject;
}
MySingletonObjectAccessorImpl() {
this.MySingletonObject = // complex logic here, that includes reading from a config file
}
}
用法将是:
@Autowired
MySingletonObjectAccessor msoa;
MySingletonObject mso = msoa.getInstance();
我走在正确的轨道上吗?如果是这样,MySingletonObjectAccessor 服务的正确命名约定是什么?
您可以定义一个 Bean 并添加一个范围使其成为单例。
@Configuration
class MySingletonBeanConfiguration {
//default is singleton scope
@Bean
public MySingletonBean mySingletonBean() {
return new MySingletonBean();
}
}
如果您使用单例作为配置,则使用 @Component
并使用 @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
作为单例。
如果配置文件使用 FileConfig 作为 class 名称,根据 java 标准 class 名称必须指定它有什么以及它能做什么。例如:- FileReadConfig、FileUploadConfig、DBConnectConfig、EagerInitializedSingleton、StaticBlockSingleton、EnumSingleton ....,
示例:-
@Configuration
public class MySingletonObject {
private MySingletonObject mySingletonObject;
public static final String FILENAME = "/Users/xxx/Projects/xxx/config.xml";
private XMLObject config = null;
private boolean loadConfig(String fileName) {
BufferedReader reader;
String line;
String content = "";
try {
reader = new BufferedReader(new FileReader(fileName));
while ((line = reader.readLine()) != null) {
content += line;
}
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
return false;
}
/**
* IF there is no content, the file must not be valid
*/
if (content.length() <= 0) {
return false;
}
this.config = new XMLObject(content);
return true;
}
private Configuration() {
boolean result = this.loadConfig(FILENAME);
if (!result) {
if (!this.createConfig(FILENAME)) {
System.exit(0); //Catastrophic
}
}else{
mySingletonObject = new MySingletonObject ();
}
}
@Bean("mySingletonObject")
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public MySingletonObject getMySingletonObject () {
return mySingletonObject;
}
}
现在
@Autowired
MySingletonObject msoa;
您可以在 Spring 扫描的包裹中有这样的 public 配置 class:
@Configuration
public class MySingletonProvider {
@Bean
public MySingleton nameTheMethodExactlyLikeTheBeanNameYouWant(@Value("${singleton.xml.file}") String xmlConfigFile) {
Library lib = new Library(xmlConfigFile);
return new MySingleton(lib);
}
}
我想在 Java 中创建一个单例,它需要从文件配置中读取以实例化,以及其他逻辑(因此它不仅仅是一个新的 MySingletonObject())。
在 Spring 中实现该目标的正确方法是什么?我想知道我是否应该执行以下操作:
public interface MySingletonObjectAccessor {
MySingletonObject getInstance();
}
@Service
public class MySingletonObjectAccessorImpl implements MySingletonObjectAccessor {
private MySingletonObject mySingletonObject;
@Override
public MySingletonObject getInstance() {
return mySingletonObject;
}
MySingletonObjectAccessorImpl() {
this.MySingletonObject = // complex logic here, that includes reading from a config file
}
}
用法将是:
@Autowired
MySingletonObjectAccessor msoa;
MySingletonObject mso = msoa.getInstance();
我走在正确的轨道上吗?如果是这样,MySingletonObjectAccessor 服务的正确命名约定是什么?
您可以定义一个 Bean 并添加一个范围使其成为单例。
@Configuration
class MySingletonBeanConfiguration {
//default is singleton scope
@Bean
public MySingletonBean mySingletonBean() {
return new MySingletonBean();
}
}
如果您使用单例作为配置,则使用 @Component
并使用 @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
作为单例。
如果配置文件使用 FileConfig 作为 class 名称,根据 java 标准 class 名称必须指定它有什么以及它能做什么。例如:- FileReadConfig、FileUploadConfig、DBConnectConfig、EagerInitializedSingleton、StaticBlockSingleton、EnumSingleton ....,
示例:-
@Configuration
public class MySingletonObject {
private MySingletonObject mySingletonObject;
public static final String FILENAME = "/Users/xxx/Projects/xxx/config.xml";
private XMLObject config = null;
private boolean loadConfig(String fileName) {
BufferedReader reader;
String line;
String content = "";
try {
reader = new BufferedReader(new FileReader(fileName));
while ((line = reader.readLine()) != null) {
content += line;
}
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
return false;
}
/**
* IF there is no content, the file must not be valid
*/
if (content.length() <= 0) {
return false;
}
this.config = new XMLObject(content);
return true;
}
private Configuration() {
boolean result = this.loadConfig(FILENAME);
if (!result) {
if (!this.createConfig(FILENAME)) {
System.exit(0); //Catastrophic
}
}else{
mySingletonObject = new MySingletonObject ();
}
}
@Bean("mySingletonObject")
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public MySingletonObject getMySingletonObject () {
return mySingletonObject;
}
}
现在
@Autowired
MySingletonObject msoa;
您可以在 Spring 扫描的包裹中有这样的 public 配置 class:
@Configuration
public class MySingletonProvider {
@Bean
public MySingleton nameTheMethodExactlyLikeTheBeanNameYouWant(@Value("${singleton.xml.file}") String xmlConfigFile) {
Library lib = new Library(xmlConfigFile);
return new MySingleton(lib);
}
}