1.使用注解的前提
2.开启注解扫描
3.用注解创建类对象
4.用注解@Autowired注入对象属性
5.用注解@Resource注入对象属性
(一)使用注解的前提
1.导入基本的jar包:
基本的jar包一共6个,前2个要额外自己找。后4个可以在在spring-framework上找到。
另外,要使用注解功能,要在 spring-framework上额外找出:
并作为基本jar包一起导入项目工程中。
2.创建spring配置文件,引入约束(这是使用注解所需要的约束)
如果找到要引入的约束?
在下载好的spring-framework的docs\spring-framework-reference\html 下用浏览器打开最后一个html文件-----xsd.configuration
约束代码为:
<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"> <!-- bean definitions here -->
</beans>
创建spring 配置文件(起名为Bean.xml),并赋值约束代码:即可完成配置的工作
(二)开启注解扫描
目录树:
在配置文件中,加入:
<context:component-scan base-package="package"></context:component-scan> 为开启注解扫描,会到指定包中扫描类,方法,属性上是否存在注解
package:为要扫描的包名,如com.spring.demo ,若要扫描com.spring.* ,package处可写 com.spring 代替。同理 若package=“com” 代表扫描com.* 下的源文件
如:
Bean.xml
<另外>:
还有一个比较少用的扫描标签,它只会扫描属性(即变量)
<context:annotation-config></context:annotation-config>
仅作了解即可。
(三)用注解创建类对象
1.创建一个类(要实例化的bean):
User.java:
package com.spring.demo;
import org.springframework.stereotype.Component;
@Component(value="user") //相当于配置文件里的<bean id="user" class=""></bean>
//注意:@Component("user") 也是可以的
public class User{
public void method(){
System.out.println("this is User's method...");
}
}
@Component 就是注解。(有@的)
2.测试代码:
Test_demo.java:
package com.spring.demo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test_demo {
@Test
public void Test_print(){
ApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml");
User u = (User)context.getBean("user");
u.method();
}
}
运行效果:
com.spring.demo.User@45f45fa1
this is User‘s method...
<另外>:<scope>注解的使用:
<scope>用于指定用注解创造的对象是单实例还是多实例。
默认情况下(即不写scope时),是单实例的。
当@scope(“prototype”) :表示类是多实例的,当@scope(“singleton”)即为单实例
如:
<另外>:
@Component
@Controller
@Service
@Repository
这四个注解的作用是一样的,都是创建对象
(四)用注解@Autowired注入 对象属性
注入对象属性,可以用到注解@Autowired
1.首先有个User.java:
package com.spring.demo;
import org.springframework.stereotype.Component;
@Component("user")
public class User {
public void method(){
System.out.println("user 's method.....");
}
}
第5行: 用注解自动创建User对象,且把@Component(“user”)下的类标记为一个bean。其注解内字符“user”用于给@Autowired查找到这个bean。
2.又有一个 service类:
User_Service.java:
package com.spring.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("service")
public class User_Service {
@Autowired
private User user;
public void s_method(){
user.method();
}
}
第八行,注解@Autowired 表示 User类的 user变量会被自动注入对象,注入的对象来自 User 的@Component注解创建
注意:
在使用@Autowired时,首先在容器中查询对应类型的bean
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
如果查询的结果不止一个,那么@Autowired会根据名称来查找。
如果查询的结果为空,那么会抛出异常。
3.测试代码:
Test_demo.java:
package com.spring.demo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test_demo {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("Bean1.xml");
User_Service u = (User_Service)context.getBean("service");
System.out.println(u);
u.s_method();
}
}
结果:
通过获得 User_Service 对象,调用其s_method方法 来 调用 User对象的 method方法,打印出:method.....
(五)用注解@Resource注入对象属性
@Autowired 不能指定注入哪个对象
@Resourcce 能指定注入哪个对象
如:
User_Service.java:
package com.spring.demo;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("service")
public class User_Service {
@Resource(name="user") //@Resource的 name 与 User.java 中注解@Component 中的名字(value字段)要相同
private User user;
public void s_method(){
user.method();
}
}
运行的结果与上面是一样的(用@Autowired)