使用Castle Windsor,我有一个配置了瞬态生活方式的组件:
<component id="publish.mapping.default"
service="IMyService, MyAssembly"
type="MyServiceImplementation, Myassembly"
lifestyle="transient" />
Run Code Online (Sandbox Code Playgroud)
将使用这样的:
var service = container.Resolve<IMyService>(componentId);
// service usage ....
// service goes out of scope ...
Run Code Online (Sandbox Code Playgroud)
我的问题是,服务实例是否会在超出范围后进行垃圾收集,或者Castle Windsor会保留引用吗?我发现了这个类似的问题,这意味着后者可能就是这种情况 - 但是在检查了那里发布的链接之后,我不确定讨论是关于保持引用,还是确保在实现IDisposable时对象被处理掉.我的物品不需要处理.
如果Castle Windsor坚持实例,是否有任何简单的方法来阻止这种情况(可能是通过配置)?
编辑
看来,我需要设置发布跟踪策略.可以在xml配置文件中配置,还是需要在代码中设置?是否可以按组件设置版本跟踪策略?
我从来没有找到一个很好的方法来做到这一点,所以我想我会问.
例如,在ActiveRecord模型中,数据库支持的属性会自动进行类型转换为适当的数据库支持类型.如果我有一个Category
模型,它有几个属性的,说name
和category_id
,如果我是这样的:
Category.new(params[:category])
Run Code Online (Sandbox Code Playgroud)
Rails知道这name
是一个String并且category_id
是一个Integer.
假设我有几个我要验证的瞬态/合成属性,并且它们具有特定类型.我想从表单中提交它们,我希望它们根据它们的定义自动转换为String或Integer或Date(例如).
如果我要在Rails模型中声明一些内容,例如:
attr_accessor :some_number_variable
attr_accessor :some_date
Run Code Online (Sandbox Code Playgroud)
是否有一个内置的方式来告诉Rails"我想你前强制转换为整数,而后者的日期,当我走Category.new(params[:category])
",只要params[:category][:some_number_variable]
和params[:category][:some_date]
提交给控制器的数据的一部分(我知道考虑到许多日期格式,Date示例可能有点棘手).
使用Java Serialization,我知道当一个字段被标记为瞬态时,它不是序列化的.因此,当反序列化对象时,设置为瞬态的字段会发生什么?它们是否设置为构造函数中定义的值?
以下代码抛出一个NullPointerException
.
import java.io.*;
public class NullFinalTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Foo foo = new Foo();
foo.useLock();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
new ObjectOutputStream(buffer).writeObject(foo);
foo = (Foo) new ObjectInputStream(new ByteArrayInputStream(buffer.toByteArray())).readObject();
foo.useLock();
}
public static class Foo implements Serializable {
private final String lockUsed = "lock used";
private transient final Object lock = new Object();
public void useLock() {
System.out.println("About to synchronize");
synchronized (lock) { // <- NullPointerException here on 2nd call
System.out.println(lockUsed);
} …
Run Code Online (Sandbox Code Playgroud) 在从数据源读取实体后,为标记为@Transient的字段设置值的最佳解决方案是什么?
我正在使用EclipseLink,我正在使用他的postBuild事件解决方案尝试DescriptorEventAdapter,因为我还需要使用Spring bean获取默认值(显然使用DI),但我知道是否有任何更简单的解决方案我是失踪.
提前致谢
从问题为什么Java有瞬态字段?.我能够理解瞬态.但是,在设计时无法评估使用transient关键字.
public class A implements Serializable
{
public String s;
public transient ts;
}
Run Code Online (Sandbox Code Playgroud)
如果我以另一种方式做同样的事情..
public class A implements Serializable
{
public String s;
//public transient ts;//removing this variable.
}
Run Code Online (Sandbox Code Playgroud)
并在类中使用另一个类和define方法并定义变量ts
并执行操作并将s的值保存为业务定义.
题
我没有在网上找到任何实时的例子,我将决定定义一个变量transient
.
我怎么能在设计时决定定义瞬态?有没有可以帮助我理解的实时场景?
我正在使用hibernate 4.1.9.我的代码是
@Transient
private String ldapIdTemp;
Run Code Online (Sandbox Code Playgroud)
包是
import javax.persistence.Transient;
Run Code Online (Sandbox Code Playgroud)
仍然在hibernate查询中,它不起作用并将该属性放在查询中.
查询片段的一部分(assetasset0_.ldapIdTemp为ldapIdTemp16_0_,)
我不确定我做错了什么.
在查看了一些Java Collection类的源代码之后,我发现成员变量总是被使用修改transient
.
例如,LinkedList
源代码:
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
private transient Entry<E> header = new Entry<E>(null, null, null);
private transient int size = 0;
public LinkedList()
{
header.next = header.previous = header;
}
public LinkedList(Collection<? extends E> c) {
this();
addAll(c);
}
// ...other stuff
}
Run Code Online (Sandbox Code Playgroud)
当然,不仅LinkedList
使用transient,几乎每个Java集合类都使用它transient
来修改其成员变量的至少一半.
所以,我的问题是:为什么在Java标准库中transient
使用如此广泛?
(当然每个人都知道它的定义和用法transient
,但那不是我的问题:)
我知道 @Transient 字段值不会保留在数据库中。但是,当从查询创建实体时,是否会从表中加载字段值?(该字段存在于表中)
@Transient
@Column (name = "zipcode")
Integer zipcode;
Run Code Online (Sandbox Code Playgroud) 我正在尝试将 LOCALE_ID 注入我的自定义组件并在每个 ngOnChanges 事件上跟踪它,以防它已更改(以使用其他语言重新初始化组件)。
在 AppModule 中,我有 LOCALE_ID 提供程序返回当前语言代码('en'、'fr' 等):
{
provide: LOCALE_ID,
deps: [I18NextService],
useFactory: (i18next: I18NextService) => {
return i18next.language; //string: 'en', 'ru'...
}
}
Run Code Online (Sandbox Code Playgroud)
默认情况下 OpaqueToken LOCALE_ID 注册为值“en-US”。
{
provide: LOCALE_ID,
useValue: 'en-US'
}
Run Code Online (Sandbox Code Playgroud)
然后我用构造函数注入器实现我的组件
constructor(private injector: Injector) {
}
Run Code Online (Sandbox Code Playgroud)
然后我解析 LOCALE_ID 依赖项以获取当前语言环境。
ngOnChanges(changes: SimpleChanges) {
let localeId = this.injector.get(LOCALE_ID);
...
}
Run Code Online (Sandbox Code Playgroud)
问题是 LOCALE_ID 提供程序注册为单例,我总是得到第一个解析值......
要求:
我不希望自定义组件了解我的 I18NextService
我不想更改 LOCALE_ID 解析后返回的类型。这可能会破坏其他希望 LOCALE_ID 为字符串的库\控件。这就是为什么我无法将 LOCALE_ID 解析为工厂函数的原因。
如果我可以只注册瞬态解析器就没有问题,但是 angular 2 DI 似乎没有这个功能(Aurelia 有)
欢迎提出建议!
singleton dependency-injection localization transient angular
transient ×10
java ×6
jpa ×2
.net ×1
angular ×1
c# ×1
eclipselink ×1
final ×1
hibernate ×1
localization ×1
persistence ×1
serializable ×1
singleton ×1
spring ×1
validation ×1