用注解实例化对象

/ Spring / 没有评论 / 607浏览

之前的文章中我们基本采用的都是用xml文件的方式实例化对象,但实际上spring框架还为我们提供了注解的方式实例化对象。在有些时候使用注解实例化对象要比使用xml配置文件的方式更方便快捷。我们首先看一下Component注解。

@Component("user")
public class User {

private String username;
private String password;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
<bean id="user" class="com.jilinwula.spring.User"/>

这两种方式实例化对象的方式其实是一样的。除了Component注解外spring还提供了3个其它的注解,它们分别对应项目的3个分层。它们分别是:

上述3个注解除了具有Component注解实例化对象的功能外,spring还有它们提供了其它的功能,所以我们正常在使用时推荐使用特定的注解进行标注。

上面的注解虽然可以提供实例化对象的功能,但是IOC容器和注解类还没有任何关联,也就是IOC容器并不知道注解类在哪。spring为了方便IOC容器找到注解类的路径,于是提供了<context:component-scan/>标签让我们扫描注解类,并可以通过设置resource-pattern属性过滤我们想要的注解类。下面我们通扫描注解类的方式实例化对象。

@Component("user")
public class User {

private String username;
private String password;

public User() {
setUsername("admin");
setPassword("jilinwula");
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
<context:component-scan base-package="com.jilinwula" resource-pattern="spring/U*.class"/>
@Test
public void test() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
User user = applicationContext.getBean("user", User.class);
System.out.println(user);
}
User{username='admin', password='jilinwula'}

虽然我们可以通过resource-pattern属性来选择我们想要的注解类,但有时这种方式并不能满足我们的开发需求,例如选择某一个包下的所有类等。spring为了更方便的让我们找到我们想要的注解类,于是除了提供resource-pattern属性外,还提供了两个其它的标签,来帮助我们更方便的选择。它们分别是:

我们下面看一下它们的具体使用。

@Component("user")
public class User {

private String username;
private String password;
private String nickname;

public User() {
setUsername("admin");
setNickname("吉林乌拉");
setPassword("jilinwula");
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getNickname() {
return nickname;
}

public void setNickname(String nickname) {
this.nickname = nickname;
}

@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}
@Component("work")
public class Work {

private String address;

public Work() {
setAddress("北京");
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

@Override
public String toString() {
return "Work{" +
"address='" + address + '\'' +
'}';
}
}
<context:component-scan base-package="com.jilinwula.spring">
<context:exclude-filter type="aspectj" expression="com.jilinwula.spring.user.User"/>
</context:component-scan>
@Test
public void test() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
try {
User user = applicationContext.getBean("user", User.class);
System.out.println(user);
} catch (Exception e) {
System.out.println("没有扫描到user注解类");
}
try {
Work work = applicationContext.getBean("work", Work.class);
System.out.println(work);
} catch (Exception e) {
System.out.println("没有扫描到work注解类");
}

}
没有扫描到user注解类
Work{address='北京'}
<context:component-scan base-package="com.jilinwula.spring.user">
<context:include-filter type="aspectj" expression="com.jilinwula.spring.user.User"/>
</context:component-scan>
User{username='admin', password='jilinwula', nickname='吉林乌拉'}
没有扫描到work注解类

除了上述我们演示的aspectj类型,spring还为我们提供了其它的几种类型,它们具体的区别如下图所示:

QQ截图20170518101425.jpg