Spring使用注解代替xml配置
导包
导入命名空间
复制最上面的spring-context-4.2.xsd加斜杠/放入key末尾,并选择Schema location
然后右键applicationContext.xml Openwith XmlEditor
点击Design视图 beans右键Add后执行如下
然后按下面这样填写就可以了
在applicationContext开启使用注解代替配置文件
<!--主键指定扫描这个com.itheima.domain下的所有注,
这个包的子孙包也会扫描 -->
<context:component-scan base-package="com.itheima.domain"></context:component-scan>
在类中完成配置注解
@Component("user")//相当于<bean name="user" class="com.zhicheng.domain.User"/>
public class User {
编写测试类并输出结果
public class TestDemo {
@Test
public void fun(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) ac.getBean("user");
System.out.println(user);
}
}
注解解析
/*@Service("user") 和@Component效果一样,用于区分不同层的注解
@Controller("user")
@Repository("user")*/
@Component("user")//相当于<bean name="user" class="com.otheima.domain.User"/>
@Scope("prototype")//默认值为singleton单例,prototype为多例
public class User {
//@Value("Tom")通过反射的Field赋值,破坏了封装性
private String name;
@Value("18")
private Integer age;
/*@Autowired//自动装配,问题:如果匹配多个类型一致的对象将无法选择具体注入哪一个对象
@Qualifier("car2")//使用这个注解高速Spring容器匹配哪个名称
*/
@Resource(name="car2")//手动装配,直接使用这个就好
private Car car;
public String getName() {
return name;
}
@Value("Tom")//通过set方法赋值,推荐使用
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
}
@PostConstruct //在对象创建后调用
public void init(){
System.out.println("User创建方法");
}
@PreDestroy //在对象销毁前调用
public void destory(){
System.out.println("对象销毁方法");
}
}