最近在学习springboot的时候发现我对spring不能抽象说出意思,证明当时并没理解spring只是限于使用,对于刚踏入这行的毕业生这是不行的,为了养成良好的习惯,坚持将工作中的问题总结发成博客供自己观看哈哈。
现在来看一个例子:
创建了一个functionservice类
public class FunctionService {
public String sayHello(String word) {
return "hello"+word;
}
}
接下来我要使用这个方法
/**
* @author pm_WeiYu
* functionservice 是此类的依赖
*/
public class UserFunctionService {
FunctionService fs=new FunctionService();
@Test
public void log() {
fs.sayHello("aaa");
}
}
这时候可以称userfunctionservice 要依赖 functionservice。
但这样的代码我们可以发现耦合性很高,举个例子就是我们(userfunctionservice)要去市场(functionservice)买菜(sayhello),我们需要去不同的市场买不同的菜,这时候如果有个电商平台可以将这些资源整合起来,那我们直接去电商平台(spring)购买就行了。这就把控制权交给了spring(控制反转IOC)把菜的信息(实体bean)注入(DI)给我们(userfunctionservice)供我们使用。这样我们需要买菜去电商平台下单就行了。
接下是spring的做法(spring4.x 通过java类配置文件)
加注释service,这里可以选择@component @service @Repository @Controller
@Service
public class FunctionService {
public String sayHello(String word) {
return "hello"+word;
}
}
编写一个配置类
/**
* @author pm_WeiYu
* spring配置类
*/
@Configuration
@ComponentScan("god.demo.service")
public class DiCongifg {
}
需要注入的类
/**
* @author pm_WeiYu
* functionservice 是此类的依赖
*/
public class UserFunctionService {
@Autowired
FunctionService fs;
@Test
public void log() {
AnnotationConfigApplicationContext acac=new AnnotationConfigApplicationContext(DiCongifg.class);
FunctionService bean = acac.getBean(FunctionService.class);
System.out.println(bean.sayHello("aaa"));
}
}
使用关键字@Autowired将实体注入到其中具备其功能。
在这里需要注意一下,spring-cord 4.0.2版本以上使用AnnotationConfigApplicationContext会找不到。
可以看见现在创建对象的权力交给了spring,要使用的时候将需要注入的实体注入即可。