zoukankan      html  css  js  c++  java
  • Spring IOC高级

     

     

    更多内容参见个人技术博客,无广告欢迎关注

     

    1.Spring IOC 注解基本应用

    1.1.Spring Bean 注解描述

    1.2.Spring Bean 注解应用

    1.2.1.Bean对象声明注解应用

    1.2.2.Bean对象作用域注解应用

    1.2.3.Bean对象生命周期方法注解应用

    1.2.4.Bean对象自动装配注解应用

    2.Spring IOC 注解应用进阶

    2.1.@ComponentScan注解应用

    2.2.@Bean注解应用

    2.3.@Value@PropertySource注解应用

    3.总结

    3.1.重点和难点分析

    3.2.作业

     

     

    1.SpringIOC注解基本应用

    1.1.   Spring Bean 注解描述

     

    Spring容器中描述bean方式有两种,一种是基于xml方式,一种是基于注解方式.,阶段基于注解方式描述Bean元素已经成为一种趋势.Spring中常用的bean注解有如下几种:

     

    1                修饰Bean对象的注解。(xml描述bean使用<bean>

     

    a)   @Configuration描述Bean为一个配置对象)

    b)   @Component(描述Bean为一个一般组件组件)

    c)   @Controller(描述Bean为一个控制层对象

    d)   @Service (描述Bean为一个业务层对象

    e)   @Respository描述Bean为一个持久层对象)

    f)   @Scope(描述bean的作用域)

    g)   @Lazy定义bean对象是否延迟加载)

    h)   ….

     

    1)   指定Bean生命周期方法(xml使用<bean init-method=””>)

    a)   @ PostConstruct(描述生命周期开始要调用的初始化的方法)

    b)   @ PreDestroy (描述生命周期结束时要调用的销毁的方法)

     

    说明:描述生命周期方法的注解应用时应在JDK1.7以上版本

     

    2)   自动装配注解(属性注入值):类似xml阶段bean标签的autowire属性

     

    a)   @Autowire (一般修饰构造方法set方法属性,默认按类型装配)

    b)   @Qualifier (配合Autowire注解,按名字进行装配,尤其出类型相同的bean,可以指定具体bean)

    c)   @Resource (一般修饰set方法属性,默认按名字装配)

     

    1.2.   Spring Bean 注解应用

    spring应用中假如使用注解描述bean,定义bean的依赖机制,首先需要配置

    的扫描机制(扫描某个或多个中的类),spring扫描到这个类以后,会检测类是否spring中定义的相关注解描述(例如@Controller,@Service),假如有spring底层会通过反射构建此类型的对象,然后进行管理.

     

     

    1.2.1.  Bean对象声明注解应用

    项目应用中我们自己定义的类假如需要由Spring IOC管理,可以通过相关注解进行描述,例如:

    a)   @Configuration(用于描述配置类)

    b)   @Component (描述通用性组件)

    c)   @Controller (描述MVC中控制层组件)

    d)   @Service (描述MVC 中业务层组件)

    e)   @Repository(描述MVC中持久层组件)

    说明:这些组件实现的功能是一样的,只是应用的业务场景不同

     

    应用案例分析:

     

    定义Bean组件,并使用spring注解修饰,例如

     

    publicinterfaceSysConfigDao {}

     

    @Repository

    publicclassSysConfigDaoimpl implements SysConfigDao  {}

     

     

    publicinterfaceSysConfigService {}

    @Service

    publicclassSysConfigServiceImpl implements SysConfigService  {}

     

     

    @Controller

    publicclassSysConfigController {}

     

    @Configuration

    publicclassAppConfig {}

     

    说明:使用Spring注解修饰的类,默认bean的名字为类名并且首字母小写.当然也可以为Bean对象指定名字,例如@Service(“sysConfig”)

     

    1.2.2.  Bean对象作用域注解应用

    Spring管理Bean一般会指定一个作用域,借助注解定义作用域时需要

    使用@Scope,注解中常用值为singleton或者prototype,当然还有其它的作用域,只是用的比较少而已。

     

    @Scope("singleton")

    @Component

    publicclassOpenDataSource{

    }

     

    其中:

    1)   singeton 表示单例作用域,每次获取的对象都是一样的。

    2)   prototype表示多例作用域,每次获取的对象都是不同的。

     

    1.2.3.  Bean对象生命周期方法注解应用

    Spring管理的Bean对象都有生命周期,不一定都有生命周期方法,假如有些Bean需要指定生命周期方法,基于注解实现时可以借助@PostConstruct@ PreDestroy,这个两个注解属于JDK中的API,使用时需要注意版本问题

     

    @Scope//默认是singleton

    @Component

    publicclassOpenDataSource {

    /**使用此注解修饰的方法为对象生命周期初始化方法*/

    @PostConstruct

    publicvoid init(){

    System.out.println("初始化池对象");

    }

    /**使用此注解修饰的方法为对象生命周期销毁方法*/

    @PreDestroy

    publicvoid destory(){

    System.out.println("销毁池对象");

    }

    }

     

    说明:生命周期方法注解需要在JDK1.7以后版本使用

     

    1.2.4.  Bean对象自动装配注解应用

    Spring管理Bean对象可以采用自动装配机制为属性赋值.基于注解方式进行自动装配,一般需要使用@Autowired,@Qualifier,@Resource这些注解.

     

    1)   @Autowired 可以修饰属性,构造方法,set方法,默认依据类型(属性类型,参数类型)为属性注入值.假如Spring容器多个相同类型的值,参考名字进行匹配查找(属性名,set方法参数,构造方法参数),假如名字有相同的则注入,没有相同的会注入失败.

    2)   @Qualifier 配合@Autowired注解名字属性注入值.

    3)   @Resource 可以修饰属性或set方法,默认依据名字(属性,set方法名)属性注入.假如spring容器名字相同类型不同的bean会注入失败,没有找到对应名字的bean对象,此时会依据类型再次进行查找,假如相同类型则

    直接注入,当有多个相同类型可能会注入失败(假如是按set方法进行注入,依据方法名字没找,还会参数类型查找,对应类型多个,还可能会按参数名查找,假如没找对应的,则注入失败).

     

    对象架构图分析:

     

     

     

    应用案例分析:

    @Service

    publicclass SysConfigServiceImplimplements SysConfigService{

    @Autowired

    @Qualifier("configDao")

    private SysConfigDao sysConfigDao;

    }

     

     

     

    @Controller

    publicclass SysConfigController {

    //默认先按属性名进行依赖查找,找不到则按类型进行查找.

    @Resource

    private SysConfigService sysConfigService;

    }

     

    2.SpringIOC注解应用进阶

    2.1.   @ComponentScan注解应用

    @ComponentScan注解通常用于定义在配置类上,用于配置对哪些包中类进行扫描,例如

     

    @ComponentScan("com.jt")

    publicclass AppConfig {

    }

     

    当容器初始化可以获取AppConfig类对象,通过反射获取类对象上的@ComponentScan注解,并获取注解中定义的包路径,再从指定路径下获取包下的类

     

    基于注解方式进行容器初始化

     

    AnnotationConfigApplicationContext ctx=

    new AnnotationConfigApplicationContext(AppConfig.class);

     

    容器初始化以后就可以从容器获取由Spring管理的Bean对象了。

     

    2.2.   @Bean注解应用

    @Bean注解一般用于配置类中,用于修饰相关方法,通过这样的方法返回相关对象,然后将这个对象会存储在spring容器中。

    例如:

     

    @PropertySource("config.properties")

    @ComponentScan("com.jt")

    publicclass AppConfig {//spring-configs.xml

       /**

        * 思考:不是自己写的类假如希望通过

        * 注解的方式交给spring管理,

        * 那如何实现?

        * @return

        */

       @Bean//bean存储时默认名字为方法名

       public Date newDate(){

       System.out.println("newDate()");

       //return new Date();

       return Calendar.getInstance().getTime();

       }

    }

     

     

    课堂练习一:通过注解方式整合Druid连接池对象,并将此对象交给Spring管理。

     

    代码实现:

     

    在配置类中(例如AppConfig)添加如下方法,创建Druid对象(首先要添加mysql驱动和druid依赖)。

        @Bean("dataSource")

    public DruidDataSource newDruidDataSource(){

      //1.构建对象

       DruidDataSource ds=new DruidDataSource();

      //2.设置属性

       ds.setDriverClassName("com.mysql.jdbc.Driver");

       ds.setUrl("jdbc:mysql:///jtsys");

       ds.setUsername("root");

       ds.setPassword("root");

      //3.返回对象

       returnds;

    }

     

    编写单元测试类对DruidDataSource对象进行测试。

     

    2.3.   @Value@PropertySource注解应用

    @PropertySource 注解修饰类时可以用于引入properties相关文件,然后借助@Value注解获取文件中相关内容。

     

    现在类路径下有configs.properties文件,其内容如下:

     

    jdbcDriver=com.mysql.jdbc.Driver

    jdbcUrl=jdbc:mysql:///cgbmybatis

    jdbcUser=root

    jdbcPassword=root

     

    Spring管理的Bean对象中获取文件内容,然后注入给指定属性,例如

     

     

    @Configuration

    @PropertySource("classpath:configs.properties")

    @ComponentScan("com.jt")

    publicclass AppConfig {//spring-configs.xml

    @Bean("dataSource")

    public DruidDataSource newDruidDataSource(

    @Value("${jdbcUrl}")String url,

    @Value("${jdbcDriver}")String driver,

    @Value("${jdbcUser}")String username,

    @Value("${jdbcPassword}")String password){

    DruidDataSource ds=new DruidDataSource();

    ds.setDriverClassName(driver);

    ds.setUrl(url);

    ds.setUsername(username);

    ds.setPassword(password);

    returnds;

    }

    }

     

    ${key}spring中的EL表达式,可以从configs.properties文件中获取指定内容。

    其中keyproperties文件中等号左边的内容。

     

    编写单元测试类,对如上方法进行测试,获取数据源对象,然后通过此对象获取连接并输出。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    客户端负载均衡Feign之一:申明式服务调用Feign入门示例
    客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍
    客户端负载均衡Ribbon之二:Loadbalance的源码
    spring4.0之九:websocket简单应用
    spring4.0之八:Groovy DSL
    spring4.0之七:Ordering Autowired Collections
    spring4.0之六:Generic Qualifier(泛型限定)
    spring4.0之五:@Conditional在满足特定条件下,才会实例化对象
    spring4.0之三:@RestController
    Spring4.0之四:Meta Annotation(元注解)
  • 原文地址:https://www.cnblogs.com/wood-life/p/10292743.html
Copyright © 2011-2022 走看看