首页 > 技术文章 > Spring完全注解开发

MineLSG 2020-07-09 22:05 原文

 

注解的好处:如果管理很多的Bean,要求这些Bean都配置在applocationContext.xml文件中。用了注解之后,就不需要在xml文件中配置了,Spring提供了几个辅助类会自动扫描和装配这些Bean。所以大大减少了xml文件的体积,Spring会根据配置去扫描某些包里面的类,得到类的方法或注解,不同的注解会进行不同的操作。

@Configuration

这个注解一般的来说,用在类上面,加上这个注解的类可以成为一个spring的xml配置文件,使用的是java代码的配置

//配置Spring装载类
//Configurable 指定此类为Spring配置类。作为配置类,替代XML配置文件
//ComponentScan 指定Bean范围(注解范围),扫描装载
@Configurable
@ComponentScan(basePackages = {"com.minelsh"})
public class springConfig {
}

 

创建对象的注解

Spring中作用在作用类上的注解有@Component注解和三个衍生注解:@Responsity  @Service和@Controller
三个衍生注解的说明:

@Controller:通常用于Controller类,也就是控制层(MVC)。

@Service:通常用于Service类,也就是服务层。

@Repository:通常用于DAO类,也就是持久层。

当注解在作用类上时,表明这些类似交给Spring容器进行管理的。

@Component注解的使用

@Component("conversionImpl")
//其实默认的spring中的Bean id 为 conversionImpl(首字母小写)
public class ConversionImpl implements Conversion {
​
}

 

案例1:

不指定bean的名称,默认为类名首写小写字母

@Component
public class University {
    to do sthing...
}

 

获取bean方式:

ApplicationContext ctx  = new 
                ApplicationContext context = new AnnotationConfigApplicationContext(Bean配置类);
University ust = (University) ctx.getBean("university");

 

案列2:

指定bean的名称

@Component("university1")
public class University {
    to do sthing...
}

 

获取bean方式:

ApplicationContext ctx  = new 
                ApplicationContext context = new AnnotationConfigApplicationContext(Bean配置类);
University ust = (University) ctx.getBean("university1");

 

 

在构造器上的注解

@Autowired  :根据类型(ByType)来自动匹配(核心注解)

这个注解可以用于属性,setter方法,还有构造器上,这个注解用于注入依赖的对象。当再一个属性上加上@Autowired注解,有时可能要指定一些额外的值,Spring然后会自动的将值赋给这个属性。

案例1:作用在构造器上

public class MovieRecommender {
    private final CustomerPreferenceDao customerPreferenceDao;
    @Autowired
    public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
    this.customerPreferenceDao = customerPreferenceDao;
    }
 // ...
}

 

案列2:使用在setter方法上

public class SimpleMovieLister {
    private MovieFinder movieFinder;
     @Autowired
    public void setMovieFinder(MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
    }
 // ...
}

 

案列3:使用在域属性上

public class MovieRecommender {
    private final CustomerPreferenceDao customerPreferenceDao;
    @Autowired
    private MovieCatalog movieCatalog;
    @Autowired
    public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
    this.customerPreferenceDao = customerPreferenceDao;
    }
 // ...
}

 

案列4:使用在任意方法名和产生的普通方法上

public class MovieRecommender {
    private MovieCatalog movieCatalog;
    private CustomerPreferenceDao customerPreferenceDao;
    @Autowired
    public void prepare(MovieCatalog movieCatalog,
    CustomerPreferenceDao customerPreferenceDao) {
    this.movieCatalog = movieCatalog;
    this.customerPreferenceDao = customerPreferenceDao;
    }
    // ...
}

 

案列5:使用在域属性数组上

public class MovieRecommender {
    @Autowired
    private MovieCatalog[] movieCatalogs;
    // ...
}

 

案列6:使用在集合类型上

public class MovieRecommender {
    private Set<MovieCatalog> movieCatalogs;
    @Autowired
    public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
    this.movieCatalogs = movieCatalogs;
    }
    // ...
}

 

 

@Qualifier

这个注解和@Autowired一起使用,当想对注入的过程做更多的控制,@Qualifier可以帮助指定做更详细的配置。一般在两个或多个bean是相同的类型,spring在注入的时候会出现混乱

例如有个接口叫做Hellointerface,然后两个bean都实现了Hellointerface接口

@Component
public class Bean1 implements HelloInterface {
  //
}
​
@Component
public class Bean2 implements HelloInterface {
  //
}

 

如果只使用@Autowired注解,Spring就不知道到底要注入哪一个bean。解决办法就是加上@Qualifier注解

@Component
public class BeanA {
​
  @Autowired
  @Qualifier("bean2")
  private HelloInterface dependency;
  ...

 

 

@Resource:根据类型和名称(ByType & ByName)来自动匹配(核心注解)

@Resource和@Autowired注解都是用来实现依赖注入的。只是@AutoWried按by type自动注入,而@Resource默认按byName自动注入。

@Resource有两个重要属性,分别是name和type
spring将name属性解析为bean的名字,而type属性则被解析为bean的类型。所以如果使用name属性,这使用ByName的自动注入策略,如果使用Type类型则使用ByTyoe的自动注入策略。如果都没有指定,则听过反射机制使用ByName自动注入策略。

案列1:使用@Resource注解

@Resource(name="bucket")
    private String bucketName;
    @Resource(name="style")
    private String styleName;

 

翻译为xml模式来看

<bean name="bucket" class="java.lang.String">
    <constructor-arg value="${oos.bucketName}"/>
</bean> 

<bean name="style" class="java.lang.String">
    <constructor-arg value="${oos.styleName}"/>
</bean>

 

推荐阅读