• spring(一) IOC 控制反转 、DI 依赖注入


    IOC 控制反转:创建对象的方式  变成了由Spring来主导

       IOC底层原理:对象工厂

    1、导入jar包:4个核心jar和1个依赖jar

          spring-beans-4.3.9.RELEASE.jar

          spring-context-4.3.9.RELEASE.jar

          spring-core-4.3.9.RELEASE.jar

          spring-expression-4.3.9.RELEASE.jar

          com.springsource.org.apache.commons.logging-1.1.1.jar

    2、添加xml配置文件:applicationContext.xml 约定俗成

     1 <?xml version="1.0" encoding="UTF-8"?>
     2     <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="
     5     http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd">
     6         <bean id="foo" class="x.y.Foo">
     7             <meta key="cacheName" value="foo"/>
     8             <property name="name" value="Rick"/>
     9         </bean>
    10   </beans>

    3、在xml中beans标签里注册类

              Class属性 一定为全路径 (因为ioc的底层实现是通过反射技术)

              id:通过id来 获取本类对象,一般为类名(首字母小写)

    1  <bean id="studentId" class="com.spring.Student">
    2  </bean>

    4、获取对象方式

    1     //初始化spring 容器
    2     ApplicationContext con = new ClassPathXmlApplicationContext("applicationContext.xml");
    3     //通过 getBean() 获取对象
    4     Student stu = (Student)con.getBean("studentId");
    5     stu.study();

    scope

    scope= "prototype"多实例  。 scope= " singleton "单例

    默认为单例模式 singleton

    lazy-init

    lazy-init = "true";  懒加载:使用时再创建对象

    lazy-init = "false"; 默认为false。容器初始化时创建对象

    DI  依赖注入

    概念 :启动Spring容器 加载bean配置的时候,完成对变量的赋值行为

    一:使用xml表配置注入:

     1、有参构造注入

    1     public Student(String name, int age) {
    2         super();
    3         this.name = name;
    4         this.age = age;
    5     }
    1     <bean id="studentId" class="com.spring.Student" scope="singleton" lazy-init="true">
    2     
    3         <constructor-arg name="name" value="刘杨哥哥"></constructor-arg>
    4         <constructor-arg name="age" value="20"></constructor-arg>
    5 
    6     </bean>

    2、Set方法注入

     1     public String getName() {
     2         return name;
     3     }
     4     public void setName(String name) {
     5         this.name = name;
     6     }
     7     
     8     public int getAge() {
     9         return age;
    10     }
    11     public void setAge(int age) {
    12         this.age = age;
    13     }
    1    <bean id="studentId" class="com.spring.Student" scope="singleton" lazy-init="true">
    2 
    3         <property name="name" value="liuyang"></property>
    4         <property name="age" value="20"></property>
    5         
    6    </bean>

    3、属性为对象的注入方式

     1 package com.spring_ioc1;
     2 
     3 public class Clazz {
     4     
     5     private Student stu;
     6     
     7     public Student getStu() {
     8         return stu;
     9     }
    10     public void setStu(Student stu) {
    11         this.stu = stu;
    12     }
    13 
    14     public void clzzbegin(){
    15         
    16 //        clazz依赖学生
    17         
    18         System.out.println("=== 开始上课  ===");
    19         stu.study();
    20     }
    21     
    22 }
    1     <!-- 依赖注入: clazz依赖学生: 所以需注入学生 -->
    2     <bean id="clazzId" class="com.spring.Clazz" scope="singleton" lazy-init="true">
    3         <property name="stu" ref="studentId"></property>
    4     </bean>

    4、特殊类型的对象的注入

      数组、List集合、Map集合

     1 package com.spring_ioc1;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Map;
     5 
     6 public class Property {
     7     
     8     private String arr[];
     9     private ArrayList<String> list;
    10     private Map map;
    11     
    12     public String[] getArr() {
    13         return arr;
    14     }
    15     public void setArr(String[] arr) {
    16         this.arr = arr;
    17     }
    18     public ArrayList<String> getList() {
    19         return list;
    20     }
    21     public void setList(ArrayList<String> list) {
    22         this.list = list;
    23     }
    24     public Map getMap() {
    25         return map;
    26     }
    27     public void setMap(Map map) {
    28         this.map = map;
    29     }
    30     public Property() {
    31         super();
    32     }
    33     
    34 }
     1     <bean id="propertyId" class="com.spring.Property">
     2         <property name="arr">
     3             <list>
     4                 <value>arr刘杨</value>
     5                 <value>arr刘超</value>
     6                 <value>arr刘聪</value>
     7             </list>
     8         </property>
     9         <property name="list">
    10             <list>
    11                 <value>list刘杨</value>
    12                 <value>list刘超</value>
    13                 <value>list刘聪</value>
    14             </list>
    15         </property>
    16         <property name="map">
    17             <map>
    18                 <entry key="1" value="map刘杨"></entry>
    19                 <entry key="2" value="map刘超"></entry>
    20                 <entry key="3" value="map刘聪"></entry>
    21             </map>
    22         </property>
    23     </bean>

    二:使用注解注入:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
     5         http://www.springframework.org/schema/beans 
     6         http://www.springframework.org/schema/beans/spring-beans.xsd
     7         http://www.springframework.org/schema/context 
     8         http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
     9     
    10     <!-- 自动扫描 配置  扫描所有注解 :使用注解注入 -->
    11     <context:component-scan base-package="com.spring_ioc2"></context:component-scan>
    12     
    13 </beans>
     1 package com.spring_ioc2;
     2 
     3 import javax.annotation.Resource;
     4 
     5 import org.springframework.beans.factory.annotation.Autowired;
     6 import org.springframework.beans.factory.annotation.Value;
     7 import org.springframework.context.annotation.Lazy;
     8 import org.springframework.context.annotation.Scope;
     9 import org.springframework.stereotype.Component;
    10 
    11 @Component(value="clazzId")    //相当于 <bean id="clazzId" class="com.spring.clazz"></bean>
    12 //@Scope(value="prototype")
    13 @Lazy
    14 public class Clazz {
    15     
    16     @Value("gs02班") // <property name="" value="">
    17     private String name;
    18     
    19     //@Autowired //根据student 的类型寻找        // <property name="" ref="">
    20     @Resource(name="student") //指定别名扫描寻找
    21     private Student stu;
    22     
    23     public String getName() {
    24         return name;
    25     }
    26     public void setName(String name) {
    27         this.name = name;
    28     }
    29     public Student getStu() {
    30         return stu;
    31     }
    32     public void setStu(Student stu) {
    33         this.stu = stu;
    34     }
    35     
    36     
    37     public Clazz(){
    38         System.out.println("=== clazz初始化完成  ===");
    39     }
    40     
    41     
    42     public void clzzBegin(){
    43         
    44         System.out.println("=== 开始上课喽  ===");
    45         //stu.study();
    46     }
    47     
    48 }
     1 package com.spring_ioc2;
     2 
     3 import org.springframework.beans.factory.annotation.Value;
     4 import org.springframework.stereotype.Component;
     5 
     6 @Component("student")
     7 public class Student {
     8     
     9     @Value("刘杨")
    10     private String name;
    11     private int age;
    12     
    13 
    14     public Student() {
    15         System.out.println("=== student初始化完成  ===");
    16     }
    17     
    18     public Student(String name) {
    19         this.name = name;
    20     }
    21     
    22 
    23     public Student(String name, int age) {
    24         super();
    25         this.name = name;
    26         this.age = age;
    27     }
    28 
    29     public String getName() {
    30         return name;
    31     }
    32     public void setName(String name) {
    33         this.name = name;
    34     }
    35     
    36     public int getAge() {
    37         return age;
    38     }
    39     public void setAge(int age) {
    40         this.age = age;
    41     }
    42     
    43     
    44     public void study(){
    45         System.out.println("Student study  正在努力学习!!!");
    46     }
    47 }

    三:xml表与注解混合使用注入

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
     5         http://www.springframework.org/schema/beans 
     6         http://www.springframework.org/schema/beans/spring-beans.xsd
     7         http://www.springframework.org/schema/context 
     8         http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
     9         
    10     <!-- 自动扫描 配置  扫描有限注解   :xml表与注解混合使用注入-->
    11     <context:annotation-config></context:annotation-config>
    12     
    13     <!--注册类 -->
    14     <bean id="clazzId" class="com.spring_ioc3.Clazz"></bean>
    15     <bean id="student" class="com.spring_ioc3.Student"></bean>
    16     
    17 </beans>
     1 package com.spring_ioc3;
     2 
     3 import javax.annotation.Resource;
     4 
     5 import org.springframework.beans.factory.annotation.Autowired;
     6 import org.springframework.beans.factory.annotation.Value;
     7 import org.springframework.context.annotation.Lazy;
     8 import org.springframework.context.annotation.Scope;
     9 import org.springframework.stereotype.Component;
    10 
    11 public class Clazz {
    12     
    13     @Value("gs02班") // <property name="" value="">
    14     private String name;
    15     
    16     //@Autowired //根据student 的类型寻找        // <property name="" ref="">
    17     @Resource(name="student") //指定别名扫描寻找
    18     private Student stu;
    19     
    20     public String getName() {
    21         return name;
    22     }
    23     public void setName(String name) {
    24         this.name = name;
    25     }
    26     public Student getStu() {
    27         return stu;
    28     }
    29     public void setStu(Student stu) {
    30         this.stu = stu;
    31     }
    32     
    33     
    34     public Clazz(){
    35         System.out.println("=== clazz初始化完成  ===");
    36     }
    37     
    38     public void clzzBegin(){
    39         
    40         System.out.println("=== 开始上课喽  ===");
    41         //stu.study();
    42     }
    43     
    44 }
     1 package com.spring_ioc3;
     2 
     3 import org.springframework.beans.factory.annotation.Value;
     4 import org.springframework.stereotype.Component;
     5 
     6 
     7 public class Student {
     8     
     9     @Value("刘杨")
    10     private String name;
    11     private int age;
    12     
    13 
    14     public Student() {
    15         System.out.println("=== student初始化完成  ===");
    16     }
    17     
    18     public Student(String name) {
    19         this.name = name;
    20     }
    21     
    22 
    23     public Student(String name, int age) {
    24         super();
    25         this.name = name;
    26         this.age = age;
    27     }
    28 
    29     public String getName() {
    30         return name;
    31     }
    32     public void setName(String name) {
    33         this.name = name;
    34     }
    35     
    36     public int getAge() {
    37         return age;
    38     }
    39     public void setAge(int age) {
    40         this.age = age;
    41     }
    42     
    43     
    44     public void study(){
    45         System.out.println("Student study  正在努力学习!!!");
    46     }
    47 }

     

  • 相关阅读:
    在多台PC上进行ROS通讯-学习笔记
    sd 卡驱动--基于高通平台
    Android安全研究经验谈
    连锁百货企业数据系统整理解决方案
    ros_indigo使用keyboard键盘控制虚拟或实际机器人
    ROS_RGB-D SLAM学习笔记--室内环境测试
    UE4 动画系统
    程序员如何利用空闲时间挣零花钱
    【福利】微信小程序130个精选Demo合集
    web开发快速提高工作效率的一些资源
  • 原文地址:https://www.cnblogs.com/liuyangv/p/8508388.html
Copyright © 2020-2023  润新知