您的位置:首页 > 编程语言 > Java开发

spring之IOC使用注解更方便

2017-09-05 12:02 302 查看
(一)对于Spring的IOC使用注解的方法比较方便(使用@Resource)

<?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 http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/>
</beans>

以上是配置文件需要添加的东西,用于识别注解。

1、@Required用于setter方法上,标识注入,类似于@Override(可有可无,只是可以提前发现方法是否错误)

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

2、@Autowired用于标识自动注入,主要用于setter方法上,如果没有实例注入,可以通过设置required=false ,避免报错。(默认是按类型注入byType)(不推荐使用,可以用@Resource代替)

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

3、@Qualifier(Value="bean名字")可以简写为:@Qualifier("bean名字"):用于注入特定bean的实例。其中可以直接使用bean在配置文件中的名字。(若通过按bean名字注入,可以使用该注解)

如果写在setter方法上,需要将@Qualifier(“bean名字”)写在参数上

public class UserService {
private UserDAO userDAO;  

@Autowired
public void setUserDAO(@Qualifier("u") UserDAO userDAO) {
this.userDAO = userDAO;
}

}


配置文件的配置:

  <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl"> </bean>

4、@Resource,使用该注解需要导入Common-annotations.jar包

默认是时按名字注入(byName),找不到则按类型注入;如果按名字注入:直接@Resource(“bean名字”)即可。

很明显,比@autowire更好用

public class SimpleMovieLister {
private MovieFinder movieFinder;
@Resource(name="myMovieFinder")
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}

5、@Component是Spring的注解,生成类的实例注入到容器中供使用,与之类似的还有: 
@Repository
@Service
,
and 
@Controller
 。

@Component标注类时,初始化名字默认为类名首字母小写。也可以指定初始化bean的名字:@Component(“bean名字”)即可。这时就可以不用在配置文件中配置bean了。但需要加一下内容:

<?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 http://www.springframework.org/schema/context/spring-context.xsd"> 
<context:component-scan base-package="要扫描的包路径:org.example"/>

</beans>

也可以设置那些包不用扫描(推荐使用配置的方式)

<beans>
<context:component-scan base-package="org.example">
<context:include-filter type="regex"
expression=".*Stub.*Repository"/>
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
</beans>

使用注解的方式(不推荐)

@Configuration
@ComponentScan(basePackages = "org.example",
includeFilters = @Filter(type = FilterType.REGEX, pattern = ".*Stub.*Repository"),
excludeFilters = @Filter(Repository.class))
public class AppConfig {
...
}


6、@PostConstruct =init-method   

@PreDestroy=destroy-method

public class CachingMovieLister {
@PostConstruct
public void init() {
// 初始化之前调用
}

@PreDestroy
public void destroy() {
// 容器销毁之前调用
}
}


(二)对于Spring的AOP使用xml方式比较方便
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: