从Spring 3.0开始,Spring支持标准的JSR 330:Java依赖注入 。 在Spring 3应用程序中,您可以使用标准
-
@Inject
代替Spring的@Autowired
来注入一个bean。 -
@Named
代替Spring的@Component
声明一个bean。
那些JSR-330标准注释的扫描和检索方法与Spring注释相同,只要您的类路径中包含以下jar,集成就会自动发生。
pom.xml
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
1.Spring注释
让我们看一个普通的Spring注释示例– @Autowired
和@Component
PS @Component
, @Repository
和@Service
相同,只是在Spring Ioc上下文中声明了一个bean。
CustomerDAO.java
package com.mkyong.customer.dao;
import org.springframework.stereotype.Repository;
@Repository
public class CustomerDAO
{
public void save() {
System.out.println("CustomerDAO save method...");
}
}
CustomerService.java
package com.mkyong.customer.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mkyong.customer.dao.CustomerDAO;
@Service
public class CustomerService
{
@Autowired
CustomerDAO customerDAO;
public void save() {
System.out.println("CustomerService save method...");
customerDAO.save();
}
}
2. JSR-330批注
基本上,它的工作原理相同,只是具有不同的注释– @Inject
和@Named
。
CustomerDAO.java
package com.mkyong.customer.dao;
import javax.inject.Named;
@Named
public class CustomerDAO
{
public void save() {
System.out.println("CustomerDAO save method...");
}
}
CustomerService.java
package com.mkyong.customer.services;
import javax.inject.Inject;
import javax.inject.Named;
import com.mkyong.customer.dao.CustomerDAO;
@Named
public class CustomerService
{
@Inject
CustomerDAO customerDAO;
public void save() {
System.out.println("CustomerService save method...");
customerDAO.save();
}
}
3.运行
Spring和JSR330批注都需要组件扫描才能起作用。
Spring-AutoScan.xml – Scan bean automatically
<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-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<context:component-scan base-package="com.mkyong.customer" />
</beans>
App.java – Run it
package com.mkyong;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mkyong.customer.services.CustomerService;
public class App
{
public static void main( String[] args )
{
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {"Spring-AutoScan.xml"});
CustomerService cust = (CustomerService)context.getBean("customerService");
cust.save();
}
}
上面两个例子都产生相同的输出
CustomerService save method...
CustomerDAO save method...
4. JSR-330的局限性
与Spring相比,JSR-330有一些限制:
-
@Inject
没有“ required ”属性,以确保成功注入了bean。 - 在Spring容器中,JSR-330默认情况下具有作用域单例,但是您可以使用Spring的
@Scope
来定义其他作用域。 - 不等同于Spring的
@Value
,@Required
或@Lazy
。
查阅本Spring参考资料 。
5.选择JSR-330
实际上,Spring的注释功能更强大,但仅在Spring框架上可用。 JSR-330是标准规范,并且在遵循JSR-330规范的所有J2ee环境中均受支持。
对于新项目或迁移项目,始终建议使用JSR-330批注,并且请记住,它也可以在Spring 3上运行。
下载源代码
下载它– Spring-JSR330-Example.zip (27kb)
参考文献
翻译自: https://mkyong.com/spring3/spring-3-and-jsr-330-inject-and-named-example/