Spring IOC复习与回顾
admin
2024-01-25 05:21:45

IOC

  1. IOC思想基于IOC容器完成,IOC容器底层就是对象工厂,DI(依赖注入)是IOC思想的具体实现

  2. Spring提供IOC容器实现的两种方式:

    • BeanFactory:IOC容器的基本实现方式,是Spring内部的使用接口,不提供开发人员使用

      加载配置文件时候不会创建对象,在获取对象时采取创建对象

    • ApplicatioContext:BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用

      加载配置文件的时候就会把配置文件中的对象进行创建

  3. Bean的作用域

    Spring中Bean默认是单例的,表示对IOC容器中的同一个Bean多次getBean得到的是同一个实例:

       @Testpublic void testStu(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Stu stu = (Stu) context.getBean("stu");Stu stu2 = (Stu) context.getBean("stu");System.out.println(stu);  //com.dxy.spring5.Stu@17776a8System.out.println(stu2); //com.dxy.spring5.Stu@17776a8}
    

    当然我们可以通过bean中 scope=”prototype“ 属性设置为多例

    
    

    修改后得到的输出为

    @Testpublic void testStu(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Stu stu = (Stu) context.getBean("stu");Stu stu2 = (Stu) context.getBean("stu");System.out.println(stu);  //com.dxy.spring5.Stu@17776a8System.out.println(stu2); //com.dxy.spring5.Stu@69a10787}
    

    除此之外,singleton与prototype还有以下区别:

    scope值设置为singleton时,在加载spring配置文件的时候就会创建对象

    scope值设置为prototype时,不会在加载spring配置文件的时候创建对象,而是在调用getBean方法时创建对象(每调一次就会创建一个全新的实例)

  4. Bean的生命周期

    ①通过构造器创建bean实例(无参构造)

    ②为bean 的属性设置值和对其他bean的引用(调用set方法)

    ③调用bean 的初始化方法(需要进行配置初始化的方法)

    ④bean可以使用了(对象获取到了)

    ⑤当容器关闭的时候,调用bean的销毁方法(需要进行配置销毁的方法)

    如果考虑bean的后置处理器,则bean完整的生命周期应该为七步

    ①通过构造器创建bean实例(无参构造)

    ②为bean 的属性设置值和对其他bean的引用(调用set方法)

    ③把bean实例传递给bean后置处理器的方法postProcessBeforeInitialization

    ④调用bean 的初始化方法(需要进行配置初始化的方法)

    ⑤把bean实例传递给bean后置处理器的方法postProcessAfterInitialization

    ⑥bean可以使用了(对象获取到了)

    ⑦当容器关闭的时候,调用bean的销毁方法(需要进行配置销毁的方法)

  5. Bean管理

    Bean管理指的是两个操作:①Spring创建对象;②Spring注入属性

    Bean管理操作有两种方式:①基于xml配置文件方式实现;②基于注解方式实现

    基于xml的实现方式

    
    
    
    
    

    集合的属性注入

    
    数学语文历史
    
    
    

    用的实体类:

    User类

    package com.dxy.spring5;/*** Description: 
    * date: 2022/11/15 18:42** @author dxy* @since JDK 1.8*/ public class User {private String userName;private Orders orders;public void setUserName(String name){this.userName=name;}public void setOrders(Orders orders) {this.orders = orders;}public Orders getOrders() {return orders;}@Overridepublic String toString() {return "User{" +"userName='" + userName + '\'' +", orders=" + orders +'}';} }

    Orders类

    package com.dxy.spring5;/*** Description: 
    * date: 2022/11/15 19:24** @author dxy* @since JDK 1.8*/ public class Orders {private String oname;private String address;public Orders(String oname, String address) {this.oname = oname;this.address = address;}public void setOname(String oname) {this.oname = oname;}@Overridepublic String toString() {return "Orders{" +"oname='" + oname + '\'' +", address='" + address + '\'' +'}';} }

    Stu类

    package com.dxy.spring5;import java.util.Arrays;
    import java.util.List;
    import java.util.Map;/*** Description: 
    * date: 2022/11/15 20:43** @author dxy* @since JDK 1.8*/ public class Stu {private String[] courses;private List books;private Map numbers;public void setCourses(String[] courses) {this.courses = courses;}public void setBooks(List books) {this.books = books;}public void setNumbers(Map numbers) {this.numbers = numbers;}@Overridepublic String toString() {return "Stu{" +"courses=" + Arrays.toString(courses) +", books=" + books+", numbers=" + numbers +'}';} }

    Book类

    package com.dxy.spring5;/*** Description: 
    * date: 2022/11/15 20:46** @author dxy* @since JDK 1.8*/ public class Book {private String bookName;public void setBookName(String bookName) {this.bookName = bookName;}@Overridepublic String toString() {return "Book{" +"bookName='" + bookName + '\'' +'}';} }

    用于测试的类:

    TestSpring5

    package com.dxy.spring5.testdemo;import com.dxy.spring5.Orders;
    import com.dxy.spring5.Stu;
    import com.dxy.spring5.User;
    import org.junit.Test;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;/*** Description: 
    * date: 2022/11/15 18:31** @author dxy* @since JDK 1.8*/ public class TestSpring5 {@Testpublic void testStu(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Stu stu = (Stu) context.getBean("stu");System.out.println(stu);}@Testpublic void testAdd(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");User user = (User)context.getBean("user2");Orders order = (Orders) context.getBean("order");System.out.println(user.toString());} }

    以上我们都是进行手动装配的,即在bean中指定属性以及我们要设置的值,下面我们介绍一下Spring的自动装配

    自动装配:根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入

    在xml中演示自动装配

    基于byName的自动装配:(在bean中设置autowire=“byName”,此时会根据属性名称来寻找对应id的bean,并将属性值注入)

    
    
    

    运行测试类中得到:

    User{userName='zhangsan', orders=Orders{oname='box', address='China'}}
    

    基于byType的自动装配:在bean中设置autowire=“byType”,此时会根据属性的类型来寻找对应class的bean,并将属性值注入)

    
    

    我们可以得到相同的输出结果。但需要特别注意的是,如果有多个类型相同的bean,我们就不能使用byType来进行自动装配了!

    基于注解的实现方式

    使用注解的目的:简化xml配置

    Spring针对Bean管理中创建对象提供注解:@Component @Service @Controoler @Repository

    上面四个注解功能一致,都可以创建bean实例,只不过我们习惯在不同的层上使用不同的注解,是开发更加规范

    我们先引入了context空间,然后开启组件扫描

    
    
    
    

    创建UserService类,使用注解实现Spring创建对象:

    package com.dxy.spring5.service;import org.springframework.stereotype.Service;/*** Description: 
    * date: 2022/11/16 10:30** @author dxy* @since JDK 1.8*/ //注解中value属性值可以不写,默认值是类名称首字母小写 @Service(value = "userService") //等价于 public class UserService {public void print(){System.out.println("test...");} }
    @Testpublic void testUserService(){ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");UserService userService = (UserService) context.getBean("userService");userService.print(); }
    

    使用注解方式实现属性注入:

    @Autowired:根据属性类型进行自动装配 (使用最多)

    @Qualifier:根据属性名称进行注入,使用@Qualifier时需要和@Autowired一起使用

    @Resource:既可以根据类型注入(使用@Resource),也可以根据名称注入 (使用@Resource(name=“xxx”))

    @Value:可以注入普通属性

    package com.dxy.spring5.service;import com.dxy.spring5.dao.UserDao;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;/*** Description: 
    * date: 2022/11/16 10:30** @author dxy* @since JDK 1.8*/ //注解中value属性值可以不写,默认值是类名称首字母小写 @Service(value = "userService") //等价于 public class UserService {//在service中注入dao对象,添加注入属性注解@Autowiredprivate UserDao userDao;public void print(){System.out.println("test...");userDao.print();} }

    UserDao

    package com.dxy.spring5.dao;/*** Description: 
    * date: 2022/11/16 10:47** @author dxy* @since JDK 1.8*/ public interface UserDao {public void print(); }

    UserDaoImpl

    package com.dxy.spring5.dao;import org.springframework.stereotype.Repository;/*** Description: 
    * date: 2022/11/16 10:47** @author dxy* @since JDK 1.8*/ @Repository public class UserDaoImpl implements UserDao{public void print() {System.out.println("dao test...");} }

    完全注解开发

    创建配置类,替代xml配置文件

    package com.dxy.spring5.config;import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;/*** Description: 
    * date: 2022/11/16 11:03** @author dxy* @since JDK 1.8*/ @Configuration //作为配置类,替代xml配置文件 @ComponentScan(basePackages = {"com.dxy"}) public class SpringConfig {}

    测试时也有点变化:

     @Testpublic void testUserService1(){//加载配置类ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);UserService userService = (UserService) context.getBean("userService");userService.print();}
    

相关内容

热门资讯

朝中社刊文:必须遏制日本拥核野... 转自:北京日报客户端朝中社21日发表朝鲜外务省日本研究所所长的谈话,谴责日本大幅调整安保政策,指出其...
三亚一私人影院涉黄?警方:三人... 转自:北京日报客户端来源:三亚警方
预测市场押注“全球市值第一”:... 随着人工智能技术的进步持续推动股价走高,谷歌母公司Alphabet正在向全球市值第一的宝座发起冲击,...
中国移动联合华为、中兴推出业界... IT之家 12 月 21 日消息,中国移动研究院、中国移动河南公司近日联合华为、中兴正式推出业界首个...
梦见女人什么意思,梦见女人怎么... 周公解梦 梦见女人 男人梦见女人,有时只是性欲望的表示。有时可能表示你和母亲的关系,提醒你需要加...