@Component的衍生注解
@Component
可以标注一个类成为Spring的bean,可适用于所有的类,但是无法区分Java EE开发中三层架构的层次,所以Spring提供了三个衍生注解来区分三层架构,但是并没有实际的意义,仅仅是语义上的区分,不过再开发中推荐使用衍生注解,因为在未来的版本中可能会增加新的特性。
@Controller
:Web层@Service
:业务层@Reposotory
:Dao层
注入基本数据类型
使用@Value注解。
<context:component-scan base-package="com/spring/secondday" ></context:component-scan>
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/*
* @Component("userDao") 等价于 <bean id="userDao" class="com.spring.secondday.UserDaoImpl"></bean>
*/
@Component("userDao")
public class UserDaoImpl implements UserDao {
/* @Value设置值时不需要有setters方法。 */
@Value("HelloWorld")
private String name;
public void save() { }
public String toString() {
return "UserDaoImpl [name=" + name + "]";
}
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao ud = (UserDao)ac.getBean("userDao");
System.out.println(ud);
/*Console:
* UserDaoImpl [name=HelloWorld] */
}
}
注入引用数据类型
@Autowired
:使用xml的时候是按id
注入,但这个注解是按类型注入。也就是说如下代码@Autowired \n private UserDao ud;
会自动寻找UserDao的实现类来注入,如果能找到多个则会出错。@Qualifier
:这个注解让@Autowired
强行使用按id
注入的规则,如:@Autowired \n @Qualifier(value="userDaoMybatis") \n private UserDao ud;
@Resource
:把@Autowired
和@Qualifier
结合起来。如:@Resource(name="userDao") \n private UserDao ud;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/*
* @Component("userDao") 等价于 <bean id="userDao" class="com.spring.secondday.UserDaoImpl"></bean>
*/
@Component("userDao")
public class UserDaoImpl implements UserDao {
/* @Value设置值时不需要有setters方法。 */
@Value("HelloWorld")
private String name;
public void save() { }
public String toString() {
return "UserDaoImpl [name=" + name + "]";
}
}
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component("userService")
public class UserServiceImpl implements UserService{
@Resource(name="userDao")
private UserDao ud;
public void save() { }
public String toString() {
return "UserServiceImpl [ud=" + ud + "]";
}
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService us = (UserService)ac.getBean("userService");
System.out.println(us);
/*Console:
* UserServiceImpl [ud=UserDaoImpl [name=HelloWorld]] */
}
}
配置bean的生命周期
@PostConstruct
:配置初始化时执行的方法PreDestroy
:配置工厂关闭时执行的方法
@PostConstruct
public void init(){
System.out.println("init");
}
@PreDestroy
public void destory() {
System.out.println("destory");
}
配置bean的作用域
@Scope(value="")
配置bean的作用范围,属性值和xml方式一致。
singleton
:默认的,Spring会采用单例模式创建这个对象。prototype
:多例模式。request
:应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。session
:应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。globalsession
:应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相当于session。