我们都知道并且会使用Spring提供的依赖注入功能,只要在Spring的容器中使用<bean>标签,指定了id和class的属性,spring就会在我们需要使用的使用自动的注入进程序里面,当然这个自动注入的功能依赖了注解这个功能,否则我们需要自己去容器中通过以下方式去手动取
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); OBJ obj=(BOJ) ctx.getBean("id");
Spring常用的标签
1. @Autowired
顾名思义,自动装配,策略是根据类型进行匹配,要去符合要求的类型只有一个(多个报错),因为根据类型就不需要根据名字,get/set方法就用不到,可以根据个人需求选择删除或者保留。也不用使用<bean>的property属性。值得注意的是如果同时配置了property和@Autowired,那么配置文件的优先级要比注解的高,所以不要把get/set方法忘记了。
@Autowired注解是有属性的,request属性表示该对象是否是必须的,如果写作@Autowired(request=false)就表示该对象不是必须的,Spring找不到就返回null。
虽然写了@Autowired但是还是想通过名字匹配,可以加上@Qualifier标签
@Autowired() @Qualifier("baseDao") private BaseDao baseDao;
2. @Resource
public class Zoo { @Resource(name="tiger") private Tiger tiger; @Resource(type=Monkey.class) private Monkey monkey; public String toString(){ return tiger + " " + monkey; } }
@Resource的策略有点复杂主要包括以下几种
(1)、@Resource没有设置属性,那么其策略是先根据name去匹配bean,当注解写在字段上时,name默认取字段名。
(2)、指定了name或者type属性,则根据指定的去匹配。
(3)、指定了name和type属性,两个必须都要满足,任何一个出错都报错。
(4)、@Resource是J2EE的注解,而不是Spring
3. @Service
和@Controller、@Repository、@Component都相似,用来区别不同的mvc层,都能被Spring扫描到,一般写在类上面,用来标注类。
@Service的作用
(1)、将被修饰的类申明为bean,
(2)、修饰的类在bean中的id是类名的小写
若想自己指定名字可以写作@Service("xxx")
3. @Scope
属性值有prototype、request、session、global session等
@scope默认是单例模式(singleton)
@scope("prototype")
表示每次获取Bean的时候会有一个新的实例
@scope("request")
<web-app> ... <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> ... </web-app>
@scope("session")
session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
使用注解来构造IOC容器
<context:component-scan>在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controller @Service等这些注解的类,则把这些类注册为bean。
如果配置了<context:component-scan>那么<context:annotation-config/>标签就可以不用再xml中配置了,因为前者包含了后者。
如:在base-package指明一个包
<context:component-scan base-package="cn.gacl.java"/>
表明cn.gacl.java包及其子包中,如果某个类的头上带有特定的注解【@Component/@Repository/@Service/@Controller】,就会将这个对象作为Bean注册进Spring容器。也可以在<context:component-scan base-package=” ”/>中指定多个包,如:
<context:component-scan base-package="cn.gacl.dao.impl,cn.gacl.service.impl,cn.gacl.action"/>
使用Spring常用注解汇总
@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
@Scope注解 作用域
@Lazy(true) 表示延迟初始化
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定scope作用域的(用在类上)
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定销毁方法(用在方法上)
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:
@Autowired @Qualifier("personDaoBean") 存在多个实例配合使用
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
@PostConstruct 初始化注解
@PreDestroy 摧毁注解 默认 单例 启动就加载
@Async异步方法调用