作者aynmeow (我想成为安康鱼)
看板java
标题Re: [问题]没有autowired会要自己new一堆很深的建构?
时间Thu May 12 20:19:56 2022
从个偷懒者的角度来解释看看
一开始class A 里面有N个method
call了一堆class B 每次都要new
太麻烦了吧 而且还消耗new物件的效能
聪明如我就决定用field来存B
所以就
class A{
B b = new B();
}
有够方便 这下次我一new好A, B就乖乖地躺着给我用了 洒花~
也不用重复new 浪费效能 (当然A跟B在这里都是无状态)
但是某天不幸
B也要用A (或是B 在field new出来的class里面也有new A())
所以我写了:
class B{
A a = new A();
}
然後...我的程式就炸了 Exception in thread "main" java.lang.StackOverflowError
QQ
当程式码很庞大的时候
难以避免的 类别间会互相引用, 这就是个问题
如何省去new物件跟初始化的效能, 依赖介面方便抽换的好处
或是 给框架管理能够做proxy等等优点
就让目前@Autowired成为热门解
大概这样ㄅ
※ 引述《ntpuisbest (阿龙)》之铭言:
: 之前问过类似的问题
: 大概知道了autowired的好处
: 比如说
: Spring @Autowired 搭配 @Qualifier 指定注入的Bean
: 重点在 依赖於介面 而不依赖於实作
: 这样抽换的时候就会方便很多
: 但是还是有一个地方不太懂
: 就是说如果有层层的依赖关系的话
: 没有autowired就会出现 一层层的new 建构子出现
: 但是我自己举了几个例子
: 并没有出现一层层 new的建构子
: 之前软体版有人回答过我,但是那连结已经失效了QQ
: 假设Service1 依赖於 Dao1 ,Dao1又依赖於Dao11和Dao22好了
: 以下是我的测试CODE
: 1. Dao11
: public class Dao11 {
: public void sayhi() {
: System.out.println("hi");
: }
: }
: 2.Dao22
: public class Dao22 {
: public void sayhi2() {
: System.out.println("hi fomr dao22");
: }
: }
: 3. Dao1
: public class Dao1 {
: // private Dao11 dao11;
: Dao11 dao11=new Dao11();
: Dao22 dao22=new Dao22();
: public void sayhifromDao1() {
: dao11.sayhi();
: dao22.sayhi2();
: }
: }
: 4. Service1
: public class Service1 {
: Dao1 dao1=new Dao1( );
: public void sasdf() {
: dao1.sayhifromDao1();
: }
: }
: 5. Main Class
: public class MainDriver {
: public static void main(String[] args) {
: Service1 service=new Service1();
: service.sasdf();
: }
: }
: 我的疑惑是不管我的Service依赖了几层东西
: 最後都是非常乾净清爽的
: 一行 new Service1 ();
: 并且是空的建构子,就可以做到
: 那这样就我的理解,是不是只要我没有宣告
: field在class里面
: 意思就是我没有宣告
: // private Dao11 dao11; 在Dao1 里面
: 不管我的Service1 依赖多少东西 ,最後都可以用空的建构子new出来
: 并且保证功能正常运行
: 第二个问题是
: 怎麽样造出那些
: 真的会有需要 层层 new的例子
: 这方面想不太出来
: 谢谢JAVA版
: 这几天又一直疯狂纠结这件事....
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.40.184.151 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1652358009.A.137.html
1F:推 ntpuisbest: 谢谢哦 05/13 11:17