spring(三)基于注解的IOC配置加代码操作

  • 时间:
  • 来源:互联网
  • 文章标签:

注解的配置和xml配置所达到的目的都是一样的,都是为了降低程序间的耦合。不同的只是配置形式不同。看自己个人喜好哪种配置方法

一、注解配置

这里按注解的目的进行一定的划分

创建对象的注解

@Component

作用于组件上面,将资源交给spring来管理。

属性:value可以指定这个bean的id。

对于@Conponent注解,spring做了一些细致的划分。针对于三层架构的设计模式,细分为以下三个注解

  • @Controller 表现层

  • @Service 业务层

  • @Resposity 持久层

注入数据的注解

spring中提供了两个注入的注解

  • @Autowired

@Autowired是按类型自动转配的,不支持id匹配,当有两个或以上满足类型的bean,则会发生
UnsatisfiedDependencyException异常,容器不知道要注入哪一个满足条件的bean
可以结合Qualifier注解对匹配类型的baen进行id注入

  • @Qualifier

    在自动按照类型注入的基础之上,再按照Bean的id注入。它在给字段注入时不能独立使用,必须和@Autowire一起使用;但是给方法参数注入时,可以独立使用。

  • @Resource

二合一注解来了,可以按照类型也可以按照beanid。默认是按照类型进行注入

  • @Value

    注入基本数据类型和 String 类型数据的

作用范围的注解

可以指定bean的作用范围

//service注解会将当前类交给spring容器,默认的id值才用的是驼峰命名法
@Service
@Scope()//默认是单例模式 prototype是多例模式
public class MyServiceImpl implements MyService {
    @Autowired//自动导入 默认是按照ByType的方式进行注入
    @Qualifier("Impl1") //当该类型存在多个实现类时,需要加@Qualifier 声明实现类的id 不能单独使用,配合@Autowired使用
    //@Resource(type = MyDaoImpl1.class) //
    /* 默认按着类型注入
     @Resource //name 是按着id注入
    *
    * */
    private MyDao myDao;
    @Override
    public void register() {
        myDao.save("           myDao方法");
    }
    @PostConstruct
    public void init(){
        System.out.println("init method invoke");
    }
    @PreDestroy
    public void destory(){
        System.out.println("destory method invoke");
    }
}

如上面的代码配置,注解@Service将这个类讲给spring容器,同时@Scope定义了这个bean的生命周期(最主要的还是bean的加载时机),@Autowired注解将标注的对象自动注入的这个bean中。当标注的接口有多个实现类的时候,就需要配合Qualifier一起使用了

生命周期的注解

就如上面代码中两个方法标注的注解

  • @PostConstruct

指定标注的方法为初始化方法

  • @PreDestory

指定标注的方法为销毁方法

纯注解开发的注解

纯注解实现的spring代码–待编写

  • @Configuration

标明当前类是可以替代AppicationContext.xml文件的

  • @ComponentScan

用于指定spring在初始化容器时要扫描的包。作用和在spring的xml配置文件中的:

  • @PropertySource

    用于加载.properties文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties配置文件中,就可以使用此注解指定properties配置文件的位置。

  • @Import

用于导入其他配置类,在引入其他配置类时,其他类上可以不用再写@Configuration注解。

  • @Bean

作用与方法上,将方法的返回值作为一个bean,并交给spring管理

/*
 * @Configuration 标明当前类是可以替代AppicationContext.xml文件的
 * @ComponentScan("com.gx") 扫描的包名及包下的类
 * */
@Configuration
@ComponentScan("com.gx")
@PropertySource("db33.properties")
public class ApplicationConfig {
    //引入第三方jao包 将这个类交给spring容器
    //Bean注解将方法的返回值放在springBean容器中
    //Bean的id默认就是方法的名称
    @Bean
    public Date createDate() {
        return new Date();
    }
}

二、代码使用上述注解(注解的形式)

spring的配置文件:applicationContext.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
       https://www.springframework.org/schema/context/spring-context.xsd">
    <!--<bean id="myServiceImpl" class="com.gx.service.MyServiceImpl.MyServiceImpl"></bean>-->
    <!--加载注解的解析器-->
<!--    告知spring扫描包,并对注解进行解析-->
<!--    spring会扫描当前包以及子包下的注解-->
    <context:component-scan base-package="com.gx"></context:component-scan>
<!--    可以对配置文件进行简单的加载-->
    <context:property-placeholder location="db22.properties"></context:property-placeholder>
</beans>

编写Dao接口及接口的两个实现类:

public interface MyDao {
    public void save(String name);
}
//实现类1
@Repository("Impl1")
public class MyDaoImpl1 implements MyDao {
    public void save(String name) {
        System.out.println("MyDaoImpl1 save method invoke"+name);
    }
}
//实现类2
@Repository("Impl2")
public class MyDaoImpl2 implements MyDao {
    public void save(String name) {
        System.out.println("MyDaoImpl2 save method invoke"+name);
    }
}

编写Service接口及实现了

public interface MyService {
    public void register();
}

//service注解会将当前类交给spring容器,默认的id值才用的是驼峰命名法
@Service
@Scope()//默认是单例模式 prototype是多例模式
public class MyServiceImpl implements MyService {
    @Autowired//自动导入 默认是按照ByType的方式进行注入
    @Qualifier("Impl1") //当该类型存在多个实现类时,需要加@Qualifier 声明实现类的id 不能单独使用,配合@Autowired使用
    //@Resource(type = MyDaoImpl1.class) //
    /* 默认按着类型注入
     @Resource //name 是按着id注入
    *
    * */
    private MyDao myDao;
    @Override
    public void register() {
        myDao.save("           myDao方法");
    }
    @PostConstruct
    public void init(){
        System.out.println("init method invoke");
    }
    @PreDestroy
    public void destory(){
        System.out.println("destory method invoke");
    }
}

测试配置文件读取

db22.properties配置文件:

username=aaaaaaa
classname=bbbbbbb
url=ccccccccc
pass=123123123

读取配置文件的小测试

@Repository("Impl4")
public class MyDaoImpl implements MyDao {
    
    @Value("${url}")
    private String userName;

    public void save(String name) {
        System.out.println("配置文件中properties的值"+userName);
        System.out.println("MyDaoImpl1 save method invoke"+name);
    }

    public String getUserName() {
        return userName;
    }
}

本文链接http://www.taodudu.cc/news/show-82962.html