目录
Bean基本注解开发
基本Bean注解,主要是使用注解的方式替代原有xml的<bean> 标签及其标签属性的配置
<bean id="" name=" " class=" " scope=" " lazy-init=" " init-method=" " destroy-method=" " abstract=" " autowire=" " factory-bean=" " factory-method=" "></bean>
使用@Component注解替代<bean>标签
可以通过@Component注解的value属性指定当前Bean实例的beanName,也可以省略不写,不写的情况下为当前类名首字母小写
//<bean id=”userDao” class="com.ting.dao.impl.UserDaoImpl"/>
@Component(value ="userDao")
public class UserDaoImpl implements UserDao {}
applicationContext.xml
<!--注解组件扫描:扫描指定的基本包及其子包下的类,识别使用@Component注解-->
<context:component-scan base-package="com.ting"/>
@Scope
在类上或使用了@Bean标注的方法上,标注Bean的作用范围,取值为singleton或prototype
@Lazy
在类上或使用了@Bean标注的方法上,标注Bean是否延迟加载,取值为true和false
@PostConstruct
在方法上使用,标注Bean的实例化后执行的方法
@PreDestroy
在方法上使用,标注Bean的销毁前执行方法
@Component又衍生出如下三个衍生注解
@Repository在Dao层类上使用
@Service 在Service层类上使用
@Controller 在Web层类上使用
@Repository("userDao")
public class UserDaoImpl implements UserDao{}
@Service ("userService")
public class UserServiceImpl implements UserService{}
@Controller("userService")
public class UserController {}
使用注解的方式替代xml的<property>标签完成属性的注入操作
<bean id=" " class=" ">
<property name=" " value=" "/>
<property name=" " ref=" "/>
</bean>
@Value 使用在字段或方法上,用于注入普通数据
@Autowired 使用在字段或方法上,用于根据类型(byType)注入引用数据
@Qualifier 使用在字段或方法上,结合@Autowired,根据名称注入
@Resource 使用在字段或方法上,根据类型或名称进行注入
非自定义Bean注解开发
非自定义Bean不能像自定义Bean一样使用@Component进行管理,非自定义Bean要通过工厂的方式进行实例化,使用@Bean标注方法即可,@Bean的属性为beanName,如不指定为当前工厂方法名称
//将方法返回值Bean实例以@Bean注解指定的名称存储到Spring容器中
@Bean ("datasource")
public DataSource dataSource(){
DruidDataSource dataSource= new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
dataSource.setUsername("root");
dataSource,setPassword("123456");
return dataSource;
}
)
@Bean工厂方法需要参数的话,则有如下几种注入方式:
1.使用@Autowired根据类型自动进行Bean的匹配,@Autowired可以省略;
2.使用@Qualifier根据名称进行Bean的匹配;
3.使用@Value根据名称进行普通数据类型匹配。
@Bean
@Autowired//根据类型匹配参数
public Object objectDemo01(UserDao userDao){
System.out.println(userDao);
return new Object();
}
@Bean
public Object objectDemo02(@Qualifier("userDao") UserDao userDao,
@Value("$(jdbc.username)") String username){
System.out.println(userDao);
System.out.println(username);
return new Object();
}
<!-- 加载properties文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 组件扫描 -->
<context:component-scanbase-package="com.ting"/>
<!-- 引入其他xml文件 -->
<import resource="classpath:beans.xml"/>
定义一个配置类替代原有的xml配置文件,<bean>标签以外的标签,一般都是在配置类上使用注解完成的
@Configuration注解标识的类为配置类,替代原有xml配置文件,该注解第一个作用是标识该类是一个配置类,第二个作用是具备@Component作用
@Configuration
public class ApplicationContextConfig {}
@ComponentScan组件扫描配置,替代原有xml文件中的<context:component-scan base-package=""/>
base-package的配置方式:
指定一个或多个包名:扫描指定包及其子包下使用注解的类
不配置包名:扫描当前@componentScan注解配置类所在包及其子包下的类
@Configuration
@ComponentScan(("com.ting.service","com.ting.dao")
public class ApplicationContextConfig {}
@PropertySource注解用于加载外部properties资源配置,替代原有xml中的<context:pzoperty-
placeholder location=“”/> 配置
@Configuration
@ComponentScan
@PropertySource({"classpath:jdbc.properties","classpath:xxx.properties"})
public class ApplicationContextConfig {}
@Import用于加载其他配置类,替代原有xml中的<import resource=“classpath:beans.xml”/>配置
@Configuration
@ComponentScan
@PropertySource("classpath:jdbc.properties")
@Import(OtherConfig.class)
public class ApplicationContextConfig {}
@Primary注解用于标注相同类型的Bean优先被使用权,@Primary是Spring3.0引入的,与@Component和@Bean一起使用,标注该Bean的优先级更高
@Profile注解的作用同于xml配置时学习profile属性,是进行环境切换使用的
<beans profile="test">
注解 @Profile 标注在类或方法上,标注当前产生的Bean从属于哪个环境,只有激活了当前环境,被标注的Bean才能被注册到Spring容器里,不指定环境的Bean,任何环境下都能注册到Spring容器里
@Repository("userDao")
@Profile("test")
public class UserDaoImpl implements UserDao{}
@Repository ("userDao2")
public class UserDaoImpl2 implements UserDao{}
Spring注解方式整合第三方框架
第三方框架整合,依然使用MyBatis作为整合对象,之前我们已经使用xml方式整合了MyBatis,现在使用注解方式
无非就是将xml标签替换为注解,将xml配置文件替换为配置类而已,原有xml方式整合配置如下
Spring整合MyBatis的原理,关键在于@MapperScan,@MapperScan不是Spring提供的注解,是MyBatis为了整合Spring,在整合包org.mybatis.spring.annotation中提供的
<!--配置数据源-->
<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
<!--配置SqlSessionFactoryBean-->
<bean class="org.mybatis.spring.SqlsessionFactoryBean">
<property name="datasource" ref="datasource"></property>
</bean>
<!--配置Mapper包扫描-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ting.dao"</property>
</bean>
@Configuration
//标注当前类是一个配置类 替代配置文件+@Component
@ComponentScan("com.ting")
@PropertySource("classpath:jdbc.properties")
@Import(OtherBean.class)
public class SpringConfig{
@Bean
public DataSource dataSource{
@Value("${jdbc.driver}") String driver,
@Value("${jdbc.ur1}") String url,
@Value("${jdbc.username}") String username, @Value("${jdbc.password}") String password){
DruidDataSource dataSource =new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
SqlSessionFactoryBean sqlSessionFactoryBean1=new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean;
}
}