2020.9.9spring中转控制IOC学习笔记
IOC的概念:
IOC意思是具有依赖注入功能的容器,
是可以创建对象的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例,控制权由程序员控制,而"控制反转"是指new实例工作不由程序员来做而是交给Spring容器来做。。在Spring中BeanFactory是IOC容器的实际代表者。
DI(依赖注入Dependency injection):在容器创建对象后,处理对象的依赖关系。
为了降低代码之间的耦合度,我们把所有的类都交到第三方容器来控制,那么需要使用什么类的时候就直接从容器内获取。
一注入IOC容器的几种方式
set注入方式(xml配置文件方式)
静态工厂注入方式
构造方法注入方式
基于注解的方式
1.set方式(使用spring的xml配置文件)
(1)首先再pom.xml导入jar包spring-context,这样后面才有spring.xml配置文件
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
(2)spring.xml配置
<!--id指的是Bean类自身名称,可以用name,name可多指定名称 逗号隔开 例如: name="user1,user2,user3"-->
<bean class="com.chuan.model.User" id="user">
<!--参数注入-->
<property name="password" value="Mima是你吗"/>
<property name="name" value="名字不知道"/>
</bean>
class是导入类,id是只这个bean的名称,随意取名。
property是导入类属性。以上写了两个属性。
(3)获取容器内的bean类
//加载Bean配置文件
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext ("contextPath.xml");
//获取Bean类,name指的是Bean类里面的id值
User user = ctx.getBean ("user", User.class);
System.out.println ("user = " + user);
2.注解的方式将类注入IOC容器
(1)创建一个java注解配置文件
//这是配置Configure类,
//注解Bean表示这是Bean,注册入spring的ioc容器
@Configuration
public class JavaConfig {
@Bean("linuxCmd")
LinuxConditional linuxCmd(){
LinuxConditional linuxConditional = new LinuxConditional ("hello", "dasds");
return linuxConditional;
}
@Bean("windowsCmd")
WindowsConditional windowsCmd(){
return new WindowsConditional ();
}
}
(2)获取IOC容器内的Bean类
//这是注解的方式 根据注解获取spring IOC容器内的类
AnnotationConfigApplicationContext aac = new AnnotationConfigApplicationContext (JavaConfig.class);
LinuxConditional linuxCmd = aac.getBean ("linuxCmd", LinuxConditional.class);
System.out.println ("linuxCmd = " + linuxCmd);
WindowsConditional windowsCmd = aac.getBean ("windowsCmd", WindowsConditional.class);
windowsCmd.setName ("dsad");
windowsCmd.setUrl ("https://zhangchuan/blog.csdn.net");
System.out.println ("windowsCmd = " + windowsCmd);
打印结果:
二、spring中aware接口
aware接口指的是spring当中能感知Bean类自身属性的一些接口。
- BeanAware接口是获取spring IOC容器内Bean类的自身名称。
- ResorceLoaderAware是加载resorce文件里的数据的。
- EnvironmentAware是加载resorce文件里面资源,需要试先用注解@PropertySource加载资源。
这是一个接口实现类。AwareServiceService
/**
* @Author 张川
* @博客 zhangchuan.blog.csdn.net
* @Date 2020-09-09-19:05
*/
@Service
@PropertySource (value = "javaboy.properties") //注解PRopertySource可以加载resource文件里面的资源
public class AwareService implements BeanNameAware, BeanFactoryAware, ResourceLoaderAware, EnvironmentAware{
private String BeanName;
private ResourceLoader resorceloader;
private Environment environment;
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
}
public void output () throws IOException {
System.out.println ("BeanName = " + BeanName);
Resource resource = resorceloader.getResource ("javaboy.txt");//使用资源加载器直接加载resorce文件里面的javaboy.txt文件
BufferedReader br = new BufferedReader (new InputStreamReader (resource.getInputStream ()));
String s = br.readLine ();
System.out.println ("s = " + s);
br.close ();//关闭bufferReader资源
String address = environment.getProperty ("javaboy.address"); //2。因为注解PropertySource已经加载了javaboy.propertires资源,因此只需要使用environment.getProperty来获取参数
System.out.println ("address = " + address);
}
/**
*
* 实现BeanNameAware接口类
获取bean的名称,这里的BeanName自动获取Bean类本身id属性值
* @param s
*/
public void setBeanName(String s) {
this.BeanName=s;
}
/**
* 实现Enviroment接口类,获取Bean类本身的环境。
* @param environment
*/
public void setEnvironment(Environment environment) {
this.environment=environment;
}
/**
* 获取资源加载器
* @param resourceLoader
*/
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resorceloader=resourceLoader;
}
}