Spring总结—IOC

IOC(接口)

  1. IOC思想基于IOC容器完成,IOC容器底层是对象工厂
  2. Spring提供IOC容器实现两种方式:(两个接口)
    (1)Beanfactory:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用
    加载配置文件的时候不会创建对象,在获取对象(使用)才去创建对象
    (2)ApplicationContext 接口的子接口,提供更多更强大的功能,一般由开发人员使用。
    加载配置文件时就会把在配置文件对象进行创建。
  3. Applicationcontext接口有实现类
    在这里插入图片描述

IOC操作bean管理

  1. 什么是bean管理
    (1)Spring创建对象
    (2)Spring注入属性
  2. Bean管理操作有两种方式实现
    (1)基于xml配置文件方式实现
    (2)基于注解方式实现
  3. IOC操作bean管理(FactoryBean)
    (1)Spring有两种类型bean,一种普通bean,另一种工厂bean
    (2)普通bean,在配置文件中定义bean类型就是返回类型
    (3)工厂bean,在配置文件中定义bean类型可以和返回类型不一样
    第一步创建类,让这个类作为工厂bean,实现接口factorybean
    第二步 实现接口里面的方法,在实现的方法中定义返回bean类型
//这里决定返回什么类型
public class MyBean implements FactoryBean<Course> {
    
    

    @Override
    public Course getObject() throws Exception {
    
    
        Course course=new Course();
        course.setCname("sun");
        return course;
    }

    @Override
    public Class<?> getObjectType() {
    
    
        return null;
    }

    @Override
    public boolean isSingleton() {
    
    
        return FactoryBean.super.isSingleton();
    }
}

  1. IOC操作bean管理(Bean的作用域)
    (1)在spring里面,设置创建bean实例是单实例还是多实例
    (2)在spring里面,默认情况下是单实例
    在这里插入图片描述
    (3)如何设置单实例还是多实例
    a)在spring配置文件bean标签里有属性(scope)用于设置单实例还是多实例
    b)scope属性值
    第一个值 默认值,singleton ,表示是单实例对象
    第二个值 prototype 表示是多实例对象
    在这里插入图片描述
    c)singleton和prototype区别
    第一 singleton单实例 ,prototype多实例
    第二 设置scope值是singleton时候,加载配置文件时会创建单实例对象
    设置scope值是prototype时,不是在加载spring配置文件时创建对象,在调用getBean方法时创建多实例对象

  2. IOC操作bean管理(Bean生命周期)
    (1)生命周期:从对象创建到销毁的过程
    (2)Bean的生命周期
    <1>通过构造器创建bean实例(无参数构造)
    <2>为bean的属性值和对其他bean的应用(调用set方法)
    把bean实例传递bean后置处理器方法(postProcessBeforeInitalization)*
    <3>调用bean的初始化方法(需要进行配置)
    把bean实例传递bean后置处理器
    方法(postProcessAfterInitalization)*
    <4>Bean可以使用了(对象获取到了)
    <5>当容器关闭的时候,调用bean的销毁方法(需要配置销毁的方法)

	public class Order {
    
    
    private String oname;
    public Order() {
    
    
        System.out.println("第一步 执行无参数构造创建bean实例");
    }

    public void setOname(String oname) {
    
    
        this.oname = oname;
        System.out.println("第二步 调用set方法设置属性值");
    }
    public void initMethod(){
    
    
        System.out.println("第三步 执行初始化的方法");
    }
    public void destroyMethod(){
    
    
        System.out.println("第五步 调用销毁方法,销毁");

    }
}

@Test
    public void testbean(){
    
    
        ClassPathXmlApplicationContext context=
                new ClassPathXmlApplicationContext("bean3.xml");
        Order order=context.getBean("order",Order.class);
        System.out.println("第四步 获取创建bean实例对象");
        System.out.println(order);
        context.close();
    }
}

!--    bean生命周期测试-->
    <bean id="order" class="com.sun.spring5.factorybean.Order" init-method="initMethod" destroy-method="destroyMethod">
        <property name="oname" value="xu"></property>

	加上bean的后置处理器后,bean的生命周期有七步
	演示添加后置处理器效果
	创建类,实现接口BeanPOSTProcessor
	public class MybeanPost implements BeanPostProcessor {
    
    
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    
    
        System.out.println("初始化前,执行的方法");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    
    
        System.out.println("初始化后,执行的方法");
        return bean;
    }
}

在这里插入图片描述
自动装配

实现自动装配
        bean标签属性autowire,配置自动装配
        autowire属性常用两个值:
        byName根据属性名称注入,注入值bean的id值和类属性名称一样
        byType根据属性类型注入
<bean id="emp" class="com.sun.spring5.factorybean.Emp" autowire="byType">
    </bean>
    <bean id="dept" class="com.sun.spring5.factorybean.Dept">
    </bean>

  1. IOC操作Bean管理(外部属性文件)
    (1)直接装配数据库 配置德鲁伊连接池 引入德鲁伊连接池依赖jar包

IOC操作Bean管理(基于注解方式)

  1. 什么是注解
    (1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值)
    (2)使用注解作用在类上面,方法上面,属性上面
    (3)使用注解的目的:简化xml配置

  2. Spring针对Bean管理中创建对象提供注解
    (1)@Component 普通的组件
    (2)@Service 逻辑层,service层
    (3)@Controller web层
    (4)@Respository
    上面四个注解功能是一样的,都可以用来创建bean实例

  3. 基于注解方式实现对象创建
    (1)第一步 引入依赖
    在这里插入图片描述
    (2)第二步 开启组件扫描

	<context:component-scan base-package="com.sun"></context:component-scan>

(3)第三步 创建类,在类上面添加对象注解 在注解里面value属性值可以省略不写 默认值是类名称的首字母小写 例如:UserService-userService 创建对象时相当于id值。

//value 值可以省略,默认情况下是类名首字母小写 ,即userService
@Component(value = "user")
public class UserService {
    
    
    public void add(){
    
    
        System.out.println("对象创建完成");
    }
}

组件扫描配置

<!--    示例1
        use-default-filter="false" 表示现在不使用默认filter,自己配置filter
        context:include-filter,设置扫描哪些内容-->
    <context:component-scan base-package="com.sun.Spring" use-default-filters="false">
        <context:include-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

<!--    示例二
        下面配置扫描包所有内容
        context:exclude-filter: 设置哪些内容不进行扫描-->
    <context:component-scan base-package="com.sun.Spring">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

  1. 基于注解方式实现属性的注入
    (1)@AutoWired:根据属性类型进行自动装配
    第一步 把service和dao对象创建,在service和dao类添加创建对象注解
    第二步 在service注入dao对象,在service类添加dao类型属性,在属性上面使用注解。
@Component(value = "user")
public class UserService {
    
    
    //定义dao类型属性
    //不需要添加set属性
    //添加注入属性注解
    @Autowired
    private UserDao userDao;

    public void add(){
    
    
        System.out.println("对象创建完成");
        userDao.add();

    }


}

(2)@Qualifier :根据属性名称进行注入
这个@Qualifier注解的使用,和上面@Autowired一起使用
当一个接口有多个实现类时,使用@Autowired注解不知道是哪个实现类,此时使用@Qualifier注解可以实现名称注入。

@Component(value = "user")
public class UserService {
    
    
    //定义dao类型属性
    //不需要添加set属性
    //添加注入属性注解
    @Autowired
    @Qualifier(value = "userDaoIml1")
    private UserDao userDao;   //接口类型的,注入属性时寻找他(接口)的实现类

    public void add(){
    
    
        System.out.println("对象创建完成");
        userDao.add();

    }


}

(3)@Resource :可以根据类型注入,也可以根据名称注入(不属于spring包中)
(4)@Value: 注入普通类型属性
5. 完全注解开发
(1)创建配置类,替代xml配置文件

//创建配置类替代配置文件
@Configuration  //作为配置类,替代xml配置文件
@ComponentScan(basePackages = {
    
    "com.sun"})
public class SpringConfig {
    
    
}

(2)编写测试类

 @Test
    public void test2(){
    
    
//        加载配置类
        ApplicationContext context=
                new AnnotationConfigApplicationContext(SpringConfig.class);
//        创建对象
        UserService userService=context.getBean("user", UserService.class);
        System.out.println(userService);
        userService.add();

    }

猜你喜欢

转载自blog.csdn.net/sx17860543449/article/details/123663752