Spring IOC高级

1. Spring IOC注解基本应用

1.1 Spring Bean注解描述

Spring容器中描述bean的方式有两种:

  • 基于xml方式
  • 基于注解方式

现阶段基于注解方式描述Bean元素已经成为一种趋势。

Spring中常用的bean注解有如下几种:

a. 修饰Bean对象的注解。(xml中描述bean使用<bean>)

  • @Configuration(描述Bean为一个配置对象)
  • @Component(描述Bean为一个一般组件组件)
  • @Controller(描述Bean为一个控制层对象)
  • @Service (描述Bean为一个业务层对象)
  • @Respository(描述Bean为一个持久层对象)
  • @Scope(描述bean的作用域)
  • @Lazy(定义bean对象是否延迟加载)
  • ….

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

  • @ PostConstruct(描述生命周期开始要调用的初始化的方法)
  • @ PreDestroy (描述生命周期结束时要调用的销毁的方法)

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

  • @Autowire (一般修饰构造方法或set方法或属性,默认按类型装配)
  • @Qualifier (配合Autowire注解,按名字进行装配,尤其是出类型相同的bean时,可以指定具体bean)
  • @Resource (一般修饰set方法或属性,默认按名字装配)

1.2 Spring Bean注解应用

在spring应用中假如使用注解描述bean,定义bean的依赖机制,首先需要配置类的扫描机制(扫描某个或多个包中的类),spring扫描到这个类以后,会检测类上是否有spring中定义的相关注解的描述(例如@Controller,@Service),假如有spring底层会通过反射构建此类型的对象,然后进行管理。

 

1.2.1 Bean对象声明注解应用

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

例如:

  • @Configuration(用于描述配置类)
  • @Component (描述通用性组件)
  • @Controller (描述MVC中控制层组件)
  • @Service (描述MVC 中业务层组件)
  • @Repository(描述MVC中持久层组件)

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

应用案例:

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

持久层:

public interface SysConfigDao {}

@Repository
public class SysConfigDaoimpl  implements SysConfigDao  {}

服务层 :

public interface SysConfigService {}
@Service
public class SysConfigServiceImpl implements SysConfigService  {}

 控制层:

@Controller
public class SysConfigController {}

 配置类:

@Configuration
public class AppConfig {}

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

1.2.2 Bean对象作用域注解应用

Spring 管理的Bean一般都会指定一个作用域,借助注解定义作用域时需要使用@Scope,注解中常用值为singleton或者prototype,当然还有其它的作用域,只是用的比较少。

@Scope("singleton")
@Component
public class OpenDataSource{
}

其中:

  • singeton 表示单例作用域,每次获取的对象都是一样的。
  • prototype 表示多例作用域,每次获取的对象都是不同的。

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

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

@Scope//默认是singleton
@Component
public class OpenDataSource {
  /**使用此注解修饰的方法为对象生命周期初始化方法*/
  @PostConstruct
  public void init(){
    System.out.println("初始化池对象");
  }
  /**使用此注解修饰的方法为对象生命周期销毁方法*/
  @PreDestroy
  public void destory(){
    System.out.println("销毁池对象");
  }
}

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

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

Spring管理的Bean对象可以采用自动装配机制为属性赋值。

基于注解方式进行自动装配,一般需要使用@Autowired,@Qualifier,@Resource这些注解。

  • @Autowired 可以修饰属性,构造方法,set方法,默认依据类型(属性类型,参数类型)为属性注入值。假如Spring容器中有多个相同类型的值,会参考名字进行匹配查找(属性名、set方法参数名、构造方法参数名),假如名字有相同的则注入,没有相同的会注入失败。
  • @Qualifier 配合@Autowired注解按名字为属性注入值。
  • @Resource 可以修饰属性或set方法,默认依据名字(属性名、set方法名)为属性注入值。假如spring容器中有名字相同但类型不同的bean就会注入失败,当没有找到对应名字的bean对象,此时会依据类型再次进行查找,假如相同类型则直接注入,当有多个相同类型可能会注入失败(假如是按set方法进行注入,依据方法名字没找到,还会按参数类型查找;对应类型有多个,还可能会按参数名查找,假如没找对应的,则注入失败)。

对象架构图分析:

 应用案例分析:

@Service
public class SysConfigServiceImpl implements  SysConfigService{
    @Autowired
    @Qualifier("configDao")
    private SysConfigDao sysConfigDao;
}
@Controller
public class SysConfigController {
    //默认先按属性名进行依赖查找,找不到则按类型进行查找.
    @Resource
    private SysConfigService sysConfigService;
}

2. Spring IOC注解应用进阶

2.1 @ComponentScan注解应用

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

例如:

@ComponentScan("com.jt")
public class AppConfig { 
}

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

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

AnnotationConfigApplicationContext ctx=
    new AnnotationConfigApplicationContext(AppConfig.class);

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

2.2 Bean注解应用

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

例如:

@PropertySource("config.properties")
@ComponentScan("com.jt")
public class 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.返回对象
     return ds;
}

编写单元测试类对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")
public class 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);
    return ds;
  }
}

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

其中key为properties文件中等号左边的内容。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值