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

Spring基础知识(3)

2016-05-10 17:28 387 查看
一、IoC容器装配Bean(注解方式)

1、使用注解方式进行Bean注册

xml 方式: <bean id="" class="">

spring2.5版本 提供一组注解,完成Bean注册

* @Component 描述Spring框架中Bean

第一步:

编写class,在类声明上添加@component

@Component("helloService")

// <bean id="helloService" class="...." />

public class HelloService {

}

第二步:

编写applicationContext.xml,--->通知Spring 注解类所在包

* 需要引入 context 名称空间

<context:component-scan base-package="cn.itcast.spring.a_beandefinition"></context:component-scan>

spring2.5 引入@Component 等效三个衍生注解

* @Repository 用于对DAO实现类进行标注 (持久层)

* @Service 用于对Service实现类进行标注 (业务层)

* @Controller 用于对Controller实现类进行标注 (表现层)

2、属性依赖注入

1) 简单属性的注入 通过 @Value注解完成

2) 复杂属性注入,通过@Autowired注解 完成Bean自动装配

@Autowired 默认按照类型进行注入

@Service("userService")
public class UserService {
//简单属性
@Value("wade")
private String name;

//复杂对象
@Autowired
private UserDao userDao;

@Override
public String toString() {
return "UserService [name=" + name + ", userDao=" + userDao + "]";
}

}
@Repository("userDao")
public class UserDao {

}
public class SpringTest {
@Test
public void demo1(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
System.out.println(userService);
}
}
☆注意:@Value、 @Autowired注解都可以修饰 成员变量 或者 setter方法,如果修改成员变量,不需要提供setter方法

3) 使用@Resource注解 完成复杂对象Bean装配

@Resource和@Autowired注解功能相似

@Autowired

@Qualifer("userDAO")

private UserDAO userDAO ;

等价于

@Resource(name="userDAO")

private UserDAO userDAO ;

3、Bean其它属性设置

1) 指定Bean的初始化方法和销毁方法(注解) <bean init-method="" destroy-method="" />

@PostConstruct 作用 init-method

@PreDestroy 作用 destroy-method

@Component("lifeCycleBean")
public class LifeCycleBean {
@PostConstruct
public void setup(){
System.out.println("初始化……");
}

@PreDestroy
public void teardown(){
System.out.println("销毁……");
}
}
public class SpringTest {
@Test
public void demo1(){
//		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
LifeCycleBean lifeCycleBean = (LifeCycleBean) applicationContext.getBean("lifeCycleBean");
System.out.println(lifeCycleBean);

//☆注意:如果想要销毁方法执行,必须销毁ApplicationContext,此时,使用ApplicationContext对象是不行的,要使用其子类对象:<span style="font-family: Arial, Helvetica, sans-serif;">ClassPathXmlApplicationContext</span>
applicationContext.close();
}


2) Bean的作用范围 <bean scope="" />

@Scope 注解 ,默认作用域 singleton 单例

@Component("scopeBean")
//如果没有指定scope,默认是单例singleton
@Scope("prototype")
public class ScopeBean {

}


@Test
public void demo2(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
ScopeBean scopeBean = (ScopeBean) applicationContext.getBean("scopeBean");
System.out.println(scopeBean);
ScopeBean scopeBean2 = (ScopeBean) applicationContext.getBean("scopeBean");
System.out.println(scopeBean2);

}


添加@Scope("prototype")之前效果:



添加之后:



4、Spring3.0 提供 注册Bean的注解

@Configuration 指定POJO类为Spring提供Bean定义信息

@Bean 提供一个Bean定义信息

以JavaConfig技术为核心,JavaConfig技术:其思想就是用一个java类来作为配置文件。

public class Car {
private String name;
private double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Car [name=" + name + ", price=" + price + "]";
}

}
public class Product {
private String pname;
private int pnum;
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public int getPnum() {
return pnum;
}
public void setPnum(int pnum) {
this.pnum = pnum;
}
@Override
public String toString() {
return "Product [pname=" + pname + ", pnum=" + pnum + "]";
}

}
@Configuration
public class BeanConfig {

@Bean(name="car")
public Car initCar(){
Car car = new Car();
car.setName("奥迪");
car.setPrice(400000);
return car;
}

@Bean(name="product")
public Product showProduct(){
Product product = new Product();
product.setPname("电脑");
product.setPnum(5);
return product;
}
}
public class SpringTest {
@Test
public void demo(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

Car car = (Car) applicationContext.getBean("car");
System.out.println(car);

Product product = (Product) applicationContext.getBean("product");
System.out.println(product);
}
}
结果:



5、xml和注解混合使用
很多企业开发者 还是采用 xml作为主流配置。
混合使用时的分工:
* Bean 注册 通过XML完成
* 注入使用 @Autowired 注解完成

<context:annotation-config/> 启用四个注解 使@Resource、@ PostConstruct、@ PreDestroy、@Autowired注解生效

结论 :
1)xml配置 和 注解配置 效果完全相同
2)如果Bean 来自第三方, 必须使用xml
3)Spring3.0 Bean注册方式, 使用比较少,主要用于Bean 构造逻辑及其复杂
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: