Spring——完全注解开发
文章目录一、什么是注解二、注解方式创建bean对象1、四种注解方式2、创建bean对象一、什么是注解注解是特殊的标记形式,例如前面我们用servlet注解,filter注解。格式一般都是@注解名称(“注解内容”)。注解可以用在类上,可以用在方法上,也可以用在属性上。注解的作用是为了简化xml配置的,spring开发主要是轻代码,重注解的,所以简化xml配置文件十分重要。二、注解方式创建bean对象
文章目录
一、什么是注解
注解是特殊的标记形式,例如前面我们用servlet注解,filter注解。格式一般都是@注解名称(“注解内容”)。
注解可以用在类上,可以用在方法上,也可以用在属性上。
注解的作用是为了简化xml配置的,spring开发主要是轻代码,重注解的,所以简化xml配置文件十分重要。
二、注解方式创建bean对象
1、四种注解方式
注解实例化主要是简化xml里面bean标签实例化方式。例如如果bean标签格式是:<bean id = "userDao" class="com.example.dao.impl.UserDaoImpl" >
那么对应注解格式就是@Component(“UserDao”),value值就是bean标签的id属性,而注解位置就是class属性里面的类路径。
- @Component:创建对象最简单的注解。
- @Service:主要用在业务逻辑层创建对象的注解。
- @Controller:主要用在web层对象注解。
- @Repository:主要用在Dao层对象注解。
这四种注解方式都是平级的,并不是Service注解的内容其它层次就无法使用,分了三个层次注解主要是方便我们判断这个实例化是属于哪个层次,如果不知道这个对象属于什么层次,那就用Component注解表示就好。
2、创建bean对象
实现步骤:
-
开启组件扫描
开启组件扫描就是告诉你的Spring容器,你的哪些包下面有注解创建实例化对象,如果有注解的就可以放在容器里面使用。需要将这两句放在图示位置,配置好context命名空间(这个命名空间和配置数据源里面的那个一模一样)xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
命名空间配置好之后需要在下面写一个<context:component-scan base-package="com.example"></context:component-scan>
其中base-package就是你配置的bean对象的上一级包名,下面举例的userDao对象就是在com.example.dao包下的,所以包扫描路径到com.example就好了。如果需要扫描多个包,配置里面用逗号把包路径隔开就行。
组件扫描的细节:
1.当组件扫描形如下面的xml
base-package:扫描哪个包目录下的注解类
use-default-filters:值为false时就把默认扫描关掉,只能扫描下面` <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>`里面配置的配置类型,比如我配置的这个就只能扫描到Controller注解的类。
<context:component-scan base-package="com.example" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
2.当组件扫描形如下面的xml
base-package:扫描哪个包目录下的注解类
context:exclude-filter 子标签表示哪些注解不被扫描,例如我配了expression="org.springframework.stereotype.Service",那就说明用@Service注解的类都不会被扫描到。
<context:component-scan base-package="com.example">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
- 创建类,在类上面注解
这个注解其实和<bean id="userDao" class="com.example.dao.impl.UserDaoImpl">
xml配置效果一样,只是注解开发方便很多。 - 测试效果
@Test
public void configTest001(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-Config.xml");
UserDao userDao = applicationContext.getBean("userDao", UserDao.class);
userDao.save();
}
方法被调用说明UserDao已经配置到spring容器里面了。
三、实现属性注入
1、属性注入的几种方式
- @Autowired:根据属性类型注入。
- @Qualifier:根据属性名称进行注入。
- @Resource:即可以根据类型注入,也可以根据名称注入。
- @Value:注入普通数据类型。
2、几种属性注入实现过程
- @Autowired:根据属性类型注入。我演示在UserDaoImpl里面注入User属性。
(1)创建两个类UserDaoImpl和User类,在两个类上面都要注解。(第一步的注解)
(2)在UserDaoImpl里面注入User属性
直接在属性上面配置注解
@Component("userDao")
public class UserDaoImpl implements UserDao {
//通过属性名称注入
@Autowired
private User user;
@Override
public void save() {
System.out.println("Save方法被调用了~~~");
user.print();
}
}
(3)测试结果
运行结果里面有user类里面的方法打印,说明user属性引入成功了。
@Test
public void configTest002(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-Config.xml");
UserDao userDao = applicationContext.getBean("userDao", UserDao.class);
userDao.save();
}
- @Qualifier:根据属性名称进行注入。
Qualifier要与Autowired一起使用,Qualifier里面的value就是现在Autowired的对应实现类,比如一个接口可能会有很多歌实现类,Qualifier里面的名字就是实现类配置的名字。
- @Resource:即可以根据类型注入,也可以根据名称注入。
Resource注解用法和前面两种一样,在引用数据的上面加上@ Resource,如果是根据属性类型注入,直接@Resource,若是根据属性名注入,形如@Resource(name=“名称”)
- @Value:注入普通数据类型。
这个注入方法就是注入普通数据类型的,比如int,String,Boolean等都是普通数据类型。使用的时候只需要在属性上面加上
@Value(“值”)就可以了。
@Component("userDao")
public class UserDaoImpl implements UserDao {
//通过属性类型注入
@Resource(name="user")
private User user;
@Override
public void save() {
System.out.println("Save方法被调用了~~~");
user.say();
}
}
运行结果:
看到输出的配置的信息,证明这种方式配置普通数据类型的注解是可行的。
四、完全注解开发
spring是重配置而轻代码的框架,我们在开发过程中如果既有配置文件,又有注解,那还是显得特别的杂乱。那是否可以实现完全注解开发呢,也就是不需要利用xml配置文件,直接全部配置信息都用注解。你可能学了前面两步利用注解创建类,以及利用注解注入属性就说可以完成完全使用注解开发,是这样吗?显然还没有到达那种程度,前面注解的都是你自己定义的bean对象的实现类或者你自己想要注入的属性,那系统也有定义不同的类啊,难道你全部重构它的源代码,显然不可行。下面就介绍我们以前无法完成的注解。
1、完全注解开发的几种注解
- @Configuration:用于指定配置类,可以替代以前的xml文件,告诉容器有这个注释的配置类,创建容器时都会在该类上面加载。
- @ComponentScan:这个注解就是替代我们前面介绍的包扫描的那个标签,只需要在初始配置类加上这个注解就可以初始化容器想要扫描的包。
- @Bean:这个注解使用在方法上,用于返回在IOC容器里面加载的类,返回一个值作为容器里面的实例化。
- @PropertySource:加载.properties文件中的配置,比如连接的信息啊,连接驱动的注册,数据库地址,数据库用户名密码都可以用这个注解配置。
- @Import:用于导入其他的配置类,我们的配置类不可能就只有一个,有一个主的配置类会加载所有的配置类,xml用import标签,注解方式就用Import注解。
2、几种注解的使用方法
- @Configuration
表名该类是一个配置类,相当于xml配置文件
- @ComponentScan
注解我们想要扫描的包,相当于<context:component-scan base-package="com.example"></context:component-scan>
- @Bean
这个注解使用在方法上,用于返回在IOC容器里面加载的类,返回一个值作为容器里面的实例化。
//表示该类是一个配置类
@Configuration
//配置我们想要扫描的包
@ComponentScan("com.example")
public class DataSourceConfig {
//相当于xml里面bean标签
@Bean("dataSource")
public DruidDataSource getDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/dbcsdn");
dataSource.setUsername("root");
dataSource.setPassword("1234");
return dataSource;
}
}
- @PropertySource
加载.properties文件中的配置,相当于<context:property-placeholder location="classpath:druid.properties"></context:property-placeholder>
//表示该类是一个配置类
@Configuration
//配置我们想要扫描的包
@ComponentScan("com.example")
//记载properties文件里面的信息
@PropertySource("classpath:druid.properties")
public class DataSourceConfig {
@Value("${druid.driver}")
private String driver;
@Value("${druid.url}")
private String url;
@Value("${druid.username}")
private String username;
@Value("${druid.password}")
private String password;
//相当于xml里面bean标签
@Bean("dataSource")
public DruidDataSource getDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
- @Import:
用于导入其他的配置类,我们的配置类不可能就只有一个,有一个主的配置类会加载所有的配置类,xml用import标签,注解方式就用Import注解。
3、测试全注解开发(实现查询数据库操作)
基于上面的注解,实现查询数据库数据.
测试代码
@Test
//测试全注解
public void configTest003() throws SQLException {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
DruidDataSource dataSource = applicationContext.getBean("dataSource",DruidDataSource.class);
DruidPooledConnection connection = dataSource.getConnection();
Statement statement = connection.createStatement();
String sql = "select * from stu";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String adr = resultSet.getString("adr");
int score = resultSet.getInt("score");
String gender = resultSet.getString("gender");
System.out.print("id:"+id+"\t");
System.out.print("username:"+name+"\t");
System.out.print("password:"+adr+"\t");
System.out.print("score:"+score+"\t");
System.out.println("gender:"+gender);
}
resultSet.close();
statement.close();
connection.close();
}
DataSource配置类
//表示该类是一个配置类
@Configuration
//配置我们想要扫描的包
@ComponentScan("com.example")
//记载properties文件里面的信息
@PropertySource("classpath:druid.properties")
public class DataSourceConfig {
@Value("${druid.driver}")
private String driver;
@Value("${druid.url}")
private String url;
@Value("${druid.username}")
private String username;
@Value("${druid.password}")
private String password;
//相当于xml里面bean标签
@Bean("dataSource")
public DruidDataSource getDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
配置总类
//在主配置文件里面引入分配置文件
@Import(DataSourceConfig.class)
public class SpringConfig {
}
properties文件
druid.driver=com.mysql.jdbc.Driver
druid.url=jdbc:mysql://localhost:3306/dbcsdn
druid.username=root
druid.password=1234
数据库信息:
运行结果:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)