maven整合spring IOC(只说重点)

目录

1 什么是spring

2 spring ioc

什么是ioc

ioc原理

IOC(BeanFactory 接口)

1、IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂

2、Spring 提供 IOC 容器实现两种方式:(两个接口)

3 spring管理bean

基于注解开发(最重要,开发也基本是用注解开发)

1、什么是注解

2、Spring 针对 Bean 管理中创建对象提供注解

3 在xml里开启注解扫描

4 基于注解方式实现属性注入

xml配置实现:

1 通过set方法注入

2 通过构造器注入

3 xml 注入其他类型属性

4 xml 注入集合属性

5 IOC 操作 Bean 管理(FactoryBean)  

6 bean的作用域

7 bean的生命周期(背下来)

8 IOC 操作 Bean 管理(xml 自动装配)

9  IOC 操作 Bean 管理(外部属性文件)


1 什么是spring

Spring 是轻量级的开源的 JavaEE 框架

可以解决企业应用开发的复杂性

代码解耦等等

主要功能aop和ioc

2 spring ioc

什么是ioc

ioc:控制反转(Inversion of Control

白话:帮助我们来管理对象,为程序解耦,把对象创建和对象之间的调用过程,交给 Spring 进行管理

ioc原理

xml解析,工厂模式,反射

IOC(BeanFactory 接口)

1、IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂

2、Spring 提供 IOC 容器实现两种方式:(两个接口)

(1)BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用
加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象

(2)ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人
员进行使用
* 加载配置文件时候就会把在配置文件对象进行创建

3 spring管理bean

添加相关依赖

 <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.9</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.9</version>
            <scope>test</scope>
        </dependency>
      
       


        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.7</version>
        </dependency>




    </dependencies>

    <build>
        <resources>
            <resource>
                <!--   描述存放资源的目录,该路径相对POM路径-->
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit4</artifactId>
                        <version>2.22.0</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <includes>
                        <include>**/*.java</include>
                    </includes>
                </configuration>
            </plugin>
        </plugins>
    </build>

基于注解开发(最重要,开发也基本是用注解开发)

1、什么是注解

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

2Spring 针对 Bean 管理中创建对象提供注解

1 @Component:一般在dao层使用
2 @Service:一般在service层使用
3 @Controller:一般在类上,也就是控制器类上使用
4 @Repository:
* 上面四个注解功能是一样的,都可以用来创建 bean 实例

3 在xml里开启注解扫描

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">


        <!--开启注解扫描
        1 如果扫描多个包,多个包使用逗号隔开
        2 扫描包上层目录-->
    <context:component-scan base-package="com.star"/>
</beans>

4 基于注解方式实现属性注入

(1)@Autowired:根据属性类型进行自动装配
  (2)    @Qualifier :根据名称进行注入 这个@Qualifier 注解的使用,和上面 @Autowired 一起使用
  (3)@Resource :可以根据类型注入,可以根据名称注入
4 @Value :注入普通类型属性
实例:
创建dao层
//创建dao层
//创建dao层接口
package com.star.dao;

public interface AnnDao {
    public void ann();
}


//创建dao层实现类
@Repository(value = "re")
public class AnnDaoImpl implements AnnDao {
    @Override
    public void ann() {
        System.out.println("111111111");
    }
}

创建service层

//创建service接口
public interface AnnService {
    void ann();
}


//创建service实现类
@Service(value = "xx") //设置名称为xx
public class AnnServiceImpl implements AnnService {
    @Autowired
    @Qualifier(value = "re") //根据名称注入
    private AnnDao annDao;
    @Override
    public void ann() {
        annDao.ann();
        System.out.println("2222222222222");
    }
}

创建测试

xml配置实现:

1 通过set方法注入

创建测试类

要给测试类添加set方法

public class Emp {
    private String username;
    private String email;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

xml配置实现:

!--通过set方法注入-->
    <bean id="emp" class="com.star.pojo.Emp">
        <property name="username" value="zhangsan"/>
        <property name="email" value="zjx@163"/>
    </bean>

2 通过构造器注入

添加构造方法的时候记得把无参和有参的构造方法都加上

创建测试类

package com.star.pojo;

public class Orders {
    private String name;
    private String addDress;

    public Orders() {
    }

    public Orders(String name, String addDress) {
        this.name = name;
        this.addDress = addDress;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddDress() {
        return addDress;
    }

    public void setAddDress(String addDress) {
        this.addDress = addDress;
    }

    @Override
    public String toString() {
        return "Orders{" +
                "name='" + name + '\'' +
                ", addDress='" + addDress + '\'' +
                '}';
    }
}

xml实现:

<!--    通过有参构造器注入-->
    <bean id="orders" class="com.star.pojo.Orders">
        <constructor-arg name="name" value="张家星"/>
        <constructor-arg name="addDress" value="深圳"/>
    </bean>

xml 注入其他类型属性

<!--    注入null值-->
    <bean id="order" class="com.star.pojo.Orders">
        <property name="name">
            <null></null>
        </property>
        <property name="addDress" value="新疆"/>
    </bean>

xml 注入集合属性

创建测试类

package com.star.pojo;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class Stu {
    private String[] str;
    private Map<String,Object> map;
    private List<String> list;
    private List<Emp> emps;

    public void setEmps(List<Emp> emps) {
        this.emps = emps;
    }

    public void setStr(String[] str) {
        this.str = str;
    }

    public void setMap(Map<String, Object> map) {
        this.map = map;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    @Override
    public String toString() {
        return "Stu{" +
                "str=" + Arrays.toString(str) +
                ", map=" + map +
                ", list=" + list +
                ", emps=" + emps +
                '}';
    }
}

IOC 操作 Bean 管理(FactoryBean 

1、Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)
2、普通 bean:在配置文件中定义 bean 类型就是返回类型
3、工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样
第一步 创建类,让这个类作为工厂 bean,实现接口 FactoryBean
第二步 实现接口里面的方法,在实现的方法中定义返回的 bean 类型
java代码
创建普通类
public class Course {
    private String name;

    public Course() {
    }

    public Course(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Course{" +
                "name='" + name + '\'' +
                '}';
    }
}

创建实现接口FactoryBean的类

package com.star.factorybean;

import com.star.pojo.Course;
import org.springframework.beans.factory.FactoryBean;

public class MyBean implements FactoryBean<Course> {
    @Override
    public Course getObject() throws Exception {
        Course course = new Course("语文");
        return course;
    }

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

    @Override
    public boolean isSingleton() {
        return false;
    }
}

xml实现:

 <bean id="stu" class="com.star.pojo.Stu">
        <!-- 注入list-->
        <property name="list">
            <list>
                <value>中国</value>
                <value>美国</value>
            </list>
        </property>
        <!--注入map-->
        <property name="map">
            <map>
                <entry key="我" value="大王"/>
            </map>
        </property>
       <!-- 注入array-->
        <property name="str">
            <array>
                <value>java</value>
                <value>spring</value>
            </array>
        </property>
        <!--在数组里给对象赋值-->
        <property name="emps">
            <list>
                <ref bean="emp"/>
            </list>
        </property>
    </bean>

6 bean的作用域

1 spring默认情况下是单例可用过scope属性设置

 <!--测试bean的作用域  默认单例-->
    <bean id="scopeTest" class="com.star.pojo.ScopeTest" scope="prototype">
        <!--<property name="scopeName" value="单例模式"/>-->
        <property name="scopeName" value="多例模式"/>
    </bean>

2 单例与多例的区别

第一 singleton 单实例, prototype 多实例
第二 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象
设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用
getBean 方法时候创建多实例对象

7 bean的生命周期(背下来)

1)通过构造器创建 bean 实例(无参数构造)
(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
(3)把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
(4)调用 bean 的初始化的方法(需要进行配置初始化的方法)(5)把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization
(6)bean 可以使用了(对象获取到了)
(7)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)

8 IOC 操作 Bean 管理(xml 自动装配)

 可以通过autowire设置

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

9  IOC 操作 Bean 管理(外部属性文件)

创建properties文件

prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://locahost:3306/user
prop.userName=root
prop.password=zjx666888

在xml里引入

!--引入外部属性文件-->
    <context:property-placeholder location="db.properties"/>

    <!--配置数据库连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${prop.driverClass}"></property>
        <property name="url" value="${prop.url}"></property>
        <property name="username" value="${prop.userName}"></property>
        <property name="password" value="${prop.password}"></property>
    </bean>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值