spring核心之IOC控制反转

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;
    }

}


猜你喜欢

转载自blog.csdn.net/weixin_43919632/article/details/111086933