一、怎么用?
首先需要在bean.xml文件中配置注解组件扫描,只有配置了组件扫描,spring才会去指定包下面扫描你使用了哪些注解,并让其生效。例如:
<!--spring会去扫描com.frank包及其子包下所有的注解,并让其生效-->
<context:component-scan base-package="com.frank"></context:component-scan>
其次,依据注解的使用方法,在类或者方法的头上标记注解。
二、有哪些以及它的作用是什么?
1、@Conponent注解
作用:表示把该类交给spring容器管理。
例如:
1、先写个用于给spring管理的类,UserImp
package com.frank.service; import org.springframework.stereotype.Component; /*** UserImp* 我要把该类交给spring容器管理* 按照以前的操作,在bean.xml文件中使用bean标签,给class属性一个值(值就是该类的全限定名)* 现在使用注解的方式平替,@Conponent*/ @Component("userImp") public class UserImp { }
2、再创建bean.xml,在里面开启注解扫描
<?xml version="1.0" encoding="UTF-8"?> <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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"> <!-- <bean id="userImp" class="com.frank.service.UserImp"></bean>--> <!--spring会去扫描com.frank包及其子包下所有的注解,并让其生效--><context:component-scan base-package="com.frank"></context:component-scan> </beans>
3、编写测试类,获取userImp对象
package com.frank; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestApp {public static void main(String[] args) {ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");Object userImp = app.getBean("userImp");System.out.println(userImp);} }
2、@Controller+@Service+@Repository
@Controller注解:使用在Controller层的类上面
@Service注解:使用在Service层的类上面
@Repository注解:使用在Dao层的类上面
3、@Scope+@Lazy+@PostConstruct+@PreDestroy
@Scope注解:平替<bean scope="">,表示该类的作用域
@Lazy注解:平替<bean lazy-init="">,表示bean开启延迟加载
@PostConstruct注解:平替<bean init-method="">,表示告诉spring下面的方法是一个初始化方法
@PreDestroy注解:平替<bean destroy-method="">,表示告诉spring下面的方法是销毁方法
例如:
1、先写个用于给spring管理的类,UserImp
package com.frank.service;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component// 该注解表示把该类交给spring容器管理
@Scope(value = "singleton")//该注解表示该类的作用域使用单例模式
@Lazy(true)//该注解表示bean开启延迟加载
public class UserImp {
public UserImp() {
System.out.println("构造方法执行。。。。");
}
@PostConstruct//该注解表示告诉spring下面的方法是一个初始化方法
public void init(){
System.out.println("初始化方法执行......");
}
@PreDestroy//该注解表示告诉spring下面的方法是销毁方法
public void destroy(){
System.out.println("销毁方法执行......");
}
}
此次省略bean.xml配置文件的代码,因为跟上一个例子一样。
2、编写测试类,获取userImp对象
package com.frank;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 此类专用于测试
*/
public class TestApp {
public static void main(String[] args) {
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");
Object userImp = app.getBean("userImp");
System.out.println(userImp);
app.destroy();
}
}
4、@Value+@Autowired+@Qualifier+@Resource
平替bean标签注入时的标签
原先使用xml实现注入的时候使用的是<property>标签来指明注入的关系;现在我们可以通过下面的注解来替换它。
@value注解:使用在字段或者方法上面,用于注入普通数据
@Autowired注解:使用在属性或者方法上面,用于注入引用数据(默认按照byType方式注入)
@Qualifier注解:使用在字段或者方法上面,搭配@Autowired根据名称进行注入
@Resource注解:不给参数的时候相当于@Autowired进行注入;给了参数相当于@Autowired+@Qualifier
例如:
1、bean.xml中开启包扫描注解
<?xml version="1.0" encoding="UTF-8"?> <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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"> <!--spring会去扫描com.frank包及其子包下所有的注解,并让其生效--><context:component-scan base-package="com.frank"></context:component-scan> </beans>
2、创建UserDao接口
package com.frank.dao; public interface UserDao { }
3、编写UserDao的实现类
package com.frank.dao; import org.springframework.stereotype.Repository; @Repository("userDaoImp") public class UserDaoImp implements UserDao{ }
4、在UserImp类中添加两个属性,一个是普通字符串属性,一个是UserDao的引用
package com.frank.service; import com.frank.dao.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service("userImp") public class UserImp {@Value("frank")// 给属性name注入字符串类型的值String name; @Autowired// 根据类型,给userDao属性注入引用类型的值UserDao userDao; // 写个方法,里面打印两个属性,如果控制台打印有值说明注解注入成功public void show(){System.out.println(name);System.out.println(userDao);} }
5、在测试类中测试运行
package com.frank; import com.frank.service.UserImp; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestApp {public static void main(String[] args) {ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");UserImp userImp = (UserImp) app.getBean("userImp");userImp.show();} }
@Autowired注解是根据类型进行注入的,如果有多个UserDao类型,这个时候@Qualifier注解的作用就起来了,它的作用是当发现你使用了@Autowired注解后,却有多个相同的类型,可以通过@Qualifier注解指定其中的一个名字进行注入(按名字注入)。
5、@Bean
@Bean注解:写在某个方法上面,一般用于注入非自定义的bean。
例如:
@Bean("dataSource")// 使用@Bean注解把dataSource()方法返回的对象交给spring管理
6、@Configuration+@ComponentScan+@PropertySource+@import
@Configuration 注解: 平替bean.xml文件
@ComponentScan 注解: 平替 <context:component-scan base-package="com.frank">
@PropertySource("jdbc.properties") 注解: 平替 <context:property-placeholder location="classpath:jdbc.properties">
@Import(MyDataSource.class)注解:平替 <import resource="classpath:">
注意:bean.xml文件都被配置类给替换了,那么我在写测试类创建容器对象的时候就不能用
new ClassPathXmlApplicationContext(“bean.xml”)了;而是选择使用new AnnotationConfigApplicationContext(SpringConfig.class)。