[问题]没有autowired会要自己new一堆很深的建构?

楼主: ntpuisbest (阿龙)   2022-05-09 01:04:49
之前问过类似的问题
大概知道了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版
这几天又一直疯狂纠结这件事....
作者: ssccg (23)   2022-05-09 04:46:00
你只用你自己写的程式当然觉得都用无参数建构子就好假设你的Dao需要个一定得从外面传进来的DataSource势必要改成这一串相依类别的建构子都要有DataSource参数“所有类别都能用无参数建构子new出来”是你一厢情愿的想法就算不用依赖注入,把Dao的new直接写在Service的里也不是好事,这代表Dao的建构子一改你所有new到他的Service都要改这就是直接依赖实作的问题,即使没有特别抽出interface,只呼叫public method是只依赖于接口,呼叫到建构子是绑死实作
楼主: ntpuisbest (阿龙)   2022-05-09 08:38:00
晚点来看一下Data source例子,谢谢
作者: ssccg (23)   2022-05-09 21:17:00
你在你的Dao里面是要怎么呼叫getDatasource?那个getDatasource不是getter,是定义一个Bean (由spring的ApplicationContext管理的物件),spring的@Autowired或其他注入方式并不是找任意类别,只会从ApplicationContext中注册的Bean里找名称/类别/Qualifer符合的先不谈spring怎么做的,先集中在你一开始的问题,所以你把你的Service、Dao1、Dao11写好了,现在Dao11里面要这个DataSource,你main里只有Service1 service=new Service1()你要怎么改?是说你问法很像只有在找范例读、写些只有sout的测试,建议先找个题目写个会动的系统,真正用过这些功能再问工具是解决问题用的,你没有问题要解决,拿着工具再怎么问它哪里好用,得到答案你的感觉还是这有什么用?对你现在都在一个main就做完的需求,的确这些工具都没用
作者: gasbomb (虚空雷神兽)   2022-05-10 00:48:00
程式内容农场少看比较好…连等宽字型都没有的code没有看的价值
作者: ssccg (23)   2022-05-12 02:42:00
虽然你好像终于看出@Autowired的用处了,但是其实这只是@Autowired能直接用在field得到的方便,不是IoC/DI的好处以你上面的code来说,其实硬要继续用无参数ctor也不是不行开setter也行,甚至也可以手动reflection取代@Autowiredspring DI的重点是根本不用自己写那段“组装”的程式码,只要依照spring的惯例定义好相依关系,启动context就会自动组好,组装方式可以用field/setter/ctor都支援,@Autowired不过是标示而已,有参数的ctor也不是问题(题外话,如果只有一个ctor,不需要@Autowired标示spring也认得,我个人习惯尽可能用这种方式,可以做到immutable,也保证需要自己new的时候不会漏掉依赖,当pojo用也行)然后你说工作上没碰过复杂的组装,要不真的是micro service化/AOP用的很成功那没话说,要不就是Service其实太肥了不是单纯CRUD的系统,Service常常会需要多个Service或其他handler、adapter...之类@Component组成的吧

Links booklink

Contact Us: admin [ a t ] ucptt.com