SpringIOC

Spring -IOC

一 . Spring 框架结构

Spring 是一个Ioc 和 AOP 容器的框架

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C7fqcuVR-1595508246596)(D:\java课程\yangchx\网课\课程资料\Spring\常见异常\Spring结构图.png)]

  • 底层
    • core : 封装了架构需要的最底层部分,包括类型转换,资源访问等常用工具类
    • beans : 提供了控制反转和依赖注入,
    • context
    • ELsp
  • aop aspects
    • 提供了面向切面编程原理,
  • web 提供了web功能
  • 数据库层 : 提供对数据库操作的模块

二 . IOC (控制反转) . DI (依赖注入)

  • Spring 的核心容器, 通过控制反转,对所有对象进行创建,管理,通过依赖注入对对象进行配置,并且管理对象生命周期

  • xml 配置 ioc

    • bean 标签 : 一个bean标签代表注入对象
      • id 属性 : 配置bean对象的id
      • class 属性 : 配置对象类的全类名, ( 用于反射创建对象)
      • name 属性 : 创建对象的别名, 可以通过改名字得到对象
      • scope 属性 : 定义bean的作用范围
        • singleton:设定创建出的对象保存在spring容器中,是一个单例的对象
        • prototype:设定创建出的对象保存在spring容器中,是一个非单例的对象
        • request、session、application、 websocket :设定创建出的对象放置在web容器对应的位置
    • init-method,destroy-method : 定义该对象创建和结束时需要执行的任务
    • property 标签: 使用set方法的形式为bean提供资源
      • name : 字段名
      • value / ref 属性值
    • constructor-arg 标签 : 使用构造方法的形式为bean提供资源,兼容早期遗留系统的升级工作
    • name:对应bean中的构造方法所携带的参数名
    • value:设定非引用类型构造方法参数对应的值,不能与ref同时使用
     // xml 整合mybatis
    <!--加载perperties配置文件的信息-->
        <context:property-placeholder location="classpath:*.properties"/>
    
        <!--加载druid资源-->
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
        <!--加载SqlSession工厂bean-->
        <bean class="org.mybatis.spring.SqlSessionFactoryBean">
            <!--引入DataSource-->
            <property name="dataSource" ref="dataSource"/>
            <!--引入别名-->
            <property name="typeAliasesPackage" value="com.itheima.domain"/>
          </bean>
        <!--加载业务层实现类对象-->
        <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
            <!--注入参数-->
            <property name="accountDao" ref="accountDao"/>
         </bean>
        <!--配置存放动态代理对象的容器-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!--配置扫描到哪个包-->
            <property name="basePackage" value="com.itheima.dao"/>
        </bean>
    
    
  • 注解配置

    • @Configurable : 作用在注解类上, 标示该类是Spring 主配置类 作用在配置类上
    • @ComponentScan(“包名”) : Spring 需要扫描的包 作用在配置类上
    • @PropertiesResource (“资源文件”) : 加载外部配置文件 作用在配置类上
    • @Import (.class) 注入其他配置类 {mybatis.class …} 作用在配置类上
    • @Component (@Service – 业务层 @controller–表现层 @Resposiory – 数据层 )作用在类上 标记该类,扫描到该类时, 其实例将会被注入到Ioc容器中.
    • @Bean : 作用在方法上, 方法返回值作为该bean注入到容器中 用于加载第三方资源
    • @Value(默认属性:定义bean的id) : 注入非引用类型属性
      • value值仅支持非引用类型数据,赋值时对方法的所有参数全部赋值
      • value值支持读取properties文件中的属性值,通过类属性将properties中数据传入类中
      • value值支持SpEL
      • @value注解如果添加在属性上方,可以省略set方法(set方法的目的是为属性赋值)
    • @PostConstruct、@PreDestroy 设置该类作为bean对应的生命周期方法 定义在方法上
    • @Autowired、@Qualifier 注入引用类型的属性 ,
    • @Autowired默认按类型装配,指定@Qualifier后可以指定自动装配的bean的id
    • @Primary 指定bean装配的优先级 . 作用在类上, @Resource是JSR250规范中的注解,可以简化书写格式
    • @Autowired默认按类型装配,当出现相同类型的bean,使用@Primary提高按类型自动装配的优先级,多个@Primary 会导致优先级设置无效
/**
 * JDBC 配置类, 用来连接JDBC(像Ioc容器中注入DataSource bean)
 */
public class JDBCConfig {
    // 定义加载JDBC的四个核心参数
    @Value("${jdbc.driver}")
    private String className;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String userName;

    @Value("${jdbc.password}")
    private String passWord;

    @Bean("dataSource")
    public DataSource getDataSource(){
        DruidDataSource ds  = new DruidDataSource();
        ds.setDriverClassName(className);
        ds.setUrl(url);
        ds.setUsername(userName);
        ds.setPassword(passWord);
        return ds;
    }
}

public class MybatisConfig {
    @Autowired
    private DataSource dataSource;

    // 注入SqlSessionFactory bean
    @Bean
    public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource) {
        SqlSessionFactoryBean sfb = new SqlSessionFactoryBean();
        sfb.setDataSource(dataSource);
        sfb.setTypeAliasesPackage("com.itheima.domain");
        return sfb;
    }

    // 注入存储动态代理对象的bean
    @Bean
    public MapperScannerConfigurer getMapperScannerConfigurer() {
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.itheima");
        return msc;
    }

}

/**
 *  Spring 主配置类
 * */
@Configurable // 标记该类是Spring主配置类.
@ComponentScan("com.itheima") // 标记Spring扫描的包的范围
@PropertySource("classpath:jdbc.properties")  // 引入配置文件
@Import({JDBCConfig.class,MybatisConfig.class}) // 引入其他配置类
public class SpringConfig {
}


// 业务层接口
@Component("aaa")
public class AccountServiceImpl1 implements AccountService1 {

    @Autowired
    private AccountDao1 accountDao;

  // 数据层接口
@Component
public interface AccountDao1 {

    void save(Account account);

    void delete(Integer id);

    void update(Account account);
    @Select("select * from account")
    List<Account> findAll();

    Account findById(Integer id);
}

    // 测试类
    public class App {
    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
        AccountService1 aaa = (AccountService1) ac.getBean("aaa");
        List<Account> all = aaa.findAll();
        System.out.println(all);
    }
}

三 . 依赖加载应用场景

  • @DependsOn 微信订阅号,发布消息和订阅消息的bean的加载顺序控制 ◆

  • 双11活动期间,零点前是结算策略A,零点后是结算策略B,策略B操作的数据为促销数据。策略B 加载顺序与促销数据的加载顺序

  • @Lazy ◆程序灾难出现后对应的应急预案处理是启动容器时加载时机

  • @Order ◆多个种类的配置出现后,优先加载系统级的,然后加载业务级的,避免细粒度的加载控制

  • 应用程序运行依赖的资源由Spring为其提供,资源进入应用 程序的方式称为注入

  • 双11活动期间,零点前是结算策略A,零点后是结算策略B,策略B操作的数据为促销数据。策略B 加载顺序与促销数据的加载顺序

  • @Lazy ◆程序灾难出现后对应的应急预案处理是启动容器时加载时机

  • @Order ◆多个种类的配置出现后,优先加载系统级的,然后加载业务级的,避免细粒度的加载控制

  • 应用程序运行依赖的资源由Spring为其提供,资源进入应用 程序的方式称为注入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值