Spring通过注解装配Bean
通过注解实现ServiceImpl业务
一、使用@Component装配Bean
1、 定义类:User
在类上面加@Component注解,在属性上面加@Value值
package com.wbg.springxmlbean.entity; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; @Component(value = "user")
public class User {
@Value("2")
private int id;
@Value("韦邦杠")
private String name;
@Value("18")
private int age;
private Role role; @Override
public String toString() {
return "User{" +
"id=" + id +
", role=" + role +
", name='" + name + '\'' +
", age=" + age +
'}';
} public Role getRole() {
return role;
} public void setRole(Role role) {
this.role = role;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} }
2、使用@ComponentScan注解进行扫描包的路径
创建一个类,类上面加@CompontScan注解
测试:
ApplicationContext context=new AnnotationConfigApplicationContext(PojoConfig.class);
User user=context.getBean(User.class);
System.out.println(user);
3、创建UserService接口
public interface UserService {
User getUser();
void setUser(User user);
}
4、创建实现类UserServiceImpl,在该类上面使用@Component注解
package com.wbg.springxmlbean.service.impl; import com.wbg.springxmlbean.entity.User;
import com.wbg.springxmlbean.service.UserService;
import org.springframework.stereotype.Component; /**
* 这里的@Component 表名它是一个Spring所需要的 Bean
* 而且也实现了对于的UserService接口所定义的方法getUser、setUser
*/
@Component
public class UserServiceImpl implements UserService { private User user;
@Override
public User getUser() {
return user;
}
@Override
public void setUser(User user){
System.out.println("进入了UserServiceImpl.setUser");
System.out.println(user);
}
}
5、配置@ComponentScan制定包扫描
创建一个ApplicationConfig类,该类上面使用@ComponentScan注解
package com.wbg.springxmlbean.service.impl; import com.wbg.springxmlbean.entity.User;
import org.springframework.context.annotation.ComponentScan; /**
* basePackageClasses直接扫描指定类
*/
@ComponentScan(basePackageClasses = {User.class,UserServiceImpl.class})
/**
* basePackages可读性好,但不建议使用,因为修改包名没有提示
*/
//@ComponentScan(basePackages = {"com.wbg.springxmlbean.entity","com.wbg.springxmlbean.service"}) public class ApplicationConfig {
}
测试:
ApplicationContext context=new AnnotationConfigApplicationContext(ApplicationConfig.class);
User user=context.getBean(User.class);
UserService userService=context.getBean(UserService.class);
userService.setUser(user)
二、自动装配-@Autowired
eneity的Role类:
package com.wbg.springxmlbean.entity; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; @Component
public class Role {
@Value("1")
private int id;
@Value("roleName_1")
private String roleName;
@Value("note_1")
private String note; @Override
public String toString() {
return "Role{" +
"id=" + id +
", roleName='" + roleName + '\'' +
", note='" + note + '\'' +
'}';
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getRoleName() {
return roleName;
} public void setRoleName(String roleName) {
this.roleName = roleName;
} public String getNote() {
return note;
} public void setNote(String note) {
this.note = note;
}
}
service创建接口:RoleService
package com.wbg.springxmlbean.service; public interface RoleService {
void printRoleInfo();
}
impl实现类:RoleServiceImpl
@Component
public class RoleServiceImpl implements RoleService { @Autowired
private Role role;
@Override
public void printRoleInfo() {
System.out.println(role);
}
}
创建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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!--指定要扫描的包,如果有多个可以用逗号隔开-->
<context:component-scan base-package="com.wbg.springxmlbean.service,com.wbg.springxmlbean.entity"/>
</beans>
测试:
ApplicationContext context=new ClassPathXmlApplicationContext("Role12.xml");
RoleService userService=context.getBean(RoleService.class);
userService.printRoleInfo();
当有注解的时候
当没有的时候
三、注解@Primary
上面类:RoleServiceImpl实现了RoleService接口
再创建一个类RoleServiceImpl2进行实现RoleService接口
则RoleService接口就有两个实现类,但Spring ioc不知道采用哪个注入,然后就会出错
@Component
public class RoleServiceImpl2 implements RoleService { @Autowired
private Role role; @Override
public void printRoleInfo() {
System.out.println("进入了RoleServiceImpl22");
System.out.println(role);
}
}
在启动的时候报错
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.wbg.springxmlbean.service.RoleService' available: expected single matching bean but found 2: roleServiceImpl,roleServiceImpl2
通过@Primary注解告诉Sring ioc
测试:
1、RoleServiceImpl2
去掉RoleServiceImpl2上面的@primary注解
测试RoleServiceImpl
四、注解@Qualifier
把上面的@Primary注解去掉,然后在Controller进行使用
现在接口AdminService有两个实现类
AdminServiceImpl
AdminServiceImpl2
然后在Controller进行实现
五、使用@Bean装配Bean
@Bean的配置项中包含4个配置
name:是一个字符中数组,允许多个
autowire:标识是否是一个引用Bean对象,默认值:Autowire.NO
initMethd:自定义初始化方法
destroyMethod:自定义销毁方法
代码:
package com.wbg.springxmlbean.spring; import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import javax.sql.DataSource;
import java.beans.PropertyVetoException;
@Configuration
public class ConfigDataSource {
@Bean(name = "dataSource")
public DataSource getDataSource() throws PropertyVetoException {
ComboPooledDataSource dataSource=new ComboPooledDataSource();
dataSource.setDriverClass("org.mariadb.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mariadb://localhost:3306/wbg_logistics");
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.setMaxPoolSize(30);
return dataSource;
}
}
实现:
接口:
public interface RoleDataSourceService {
Role getRole(int id);
}
实现接口
package com.wbg.springxmlbean.service.impl; import com.wbg.springxmlbean.entity.Role;
import com.wbg.springxmlbean.service.RoleDataSourceService;
import com.wbg.springxmlbean.spring.ConfigDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; @Component
public class RoleDataSourceServiceImpl implements RoleDataSourceService { @Autowired
ConfigDataSource dataSource=null; @Override
public Role getRole(int id) {
Connection con=null;
ResultSet rs=null;
PreparedStatement ps=null;
Role role=null;
try {
con=dataSource.getDataSource().getConnection();
ps=con.prepareStatement("select * from role where id = ?");
ps.setInt(1,id);
rs=ps.executeQuery();
while (rs.next()){
role=new Role();
role.setId(rs.getInt(1));
role.setNote(rs.getString(2));
role.setNote(rs.getString(3));
}
} catch (PropertyVetoException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return role;
} }
这里Role12.xml需要扫描:
测试:
ApplicationContext context=new ClassPathXmlApplicationContext("Role12.xml");
RoleDataSourceService roleDataSourceService=context.getBean(RoleDataSourceService.class);
System.out.println(roleDataSourceService.getRole(1));
六、装配的混合使用
创建一个配置类:
@ComponentScan(basePackages = "com.wbg.springxmlbean.service")
@ImportResource({"classpath:spring-dataSource.xml"})
public class ApplicationConfig {
}
创建xml文件:
spring-dataSource.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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
">
<!--创建数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="org.mariadb.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mariadb://localhost:3306/wbg_logistics" />
<property name="user" value="root" />
<property name="password" value="123456" /> <property name="maxPoolSize" value="30" />
<property name="minPoolSize" value="10" />
<property name="autoCommitOnClose" value="false" />
<property name="checkoutTimeout" value="10000" />
<property name="acquireRetryAttempts" value="2" />
</bean> </beans>
创建接口:RoleDataSourceService2
创建实现类:
使用注解@Autowired
package com.wbg.springxmlbean.service; import com.wbg.springxmlbean.entity.Role;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; @Service
public class RoleDataSourceService2Impl implements RoleDataSourceService2 { @Autowired
DataSource dataSource;
@Override
public Role getRole(int id) {
Connection con=null;
ResultSet rs=null;
PreparedStatement ps=null;
Role role=null;
try {
con= dataSource.getConnection();
ps=con.prepareStatement("select * from role where id = ?");
ps.setInt(1,id);
rs=ps.executeQuery();
while (rs.next()){
role=new Role();
role.setId(rs.getInt(1));
role.setRoleName(rs.getString(2));
role.setNote(rs.getString(3));
}
} catch (SQLException e) {
e.printStackTrace();
}
return role;
}
}
测试:
ApplicationContext context=new AnnotationConfigApplicationContext(ApplicationConfig.class);
RoleDataSourceService2 roleDataSourceService=context.getBean(RoleDataSourceService2.class);
System.out.println(roleDataSourceService.getRole(2));
demo:https://github.com/weibanggang/springAnnotation.git
Spring通过注解装配Bean的更多相关文章
- spring 通过注解装配Bean
使用注解的方式可以减少XML的配置,注解功能更为强大,它既能实现XML的功能,也提供了自动装配的功能,采用了自动装配后,程序员所需要做的决断就少了,更加有利于对程序的开发,这就是“约定优于配置”的开发 ...
- (转)java之Spring(IOC)注解装配Bean详解
java之Spring(IOC)注解装配Bean详解 在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看 ...
- Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】
通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XML 的功能,也提供了自动装配的功能,采用了 ...
- Spring总结 1.装配bean
本随笔内容要点如下: 依赖注入 Spring装配bean的方式 条件化装配 一.依赖注入 我理解的依赖注入是这样的:所谓的依赖,就是对象所依赖的其他对象.Spring提供了一个bean容器,它负责创建 ...
- Spring 之自动化装配 bean 尝试
[Spring之自动化装配bean尝试] 1.添加dependencies如下所示(不是每一个都用得到 <dependencies> <dependency> <grou ...
- spring中自动装配bean
首先用@Component注解类: package soundsystem: import org.springframework.stereotype.Component; @Component p ...
- spring的自动装配Bean与自动检测Bean
spring可以通过编写XML来配置Bean,也可以通过使用spring的注解来装配Bean. 1.自动装配与自动检测: 自动装配:让spring自动识别如何装配bean的依赖关系,减少对<pr ...
- SpringBoot(14)—注解装配Bean
SpringBoot(14)-注解装配Bean SpringBoot装配Bean方式主要有两种 通过Java配置文件@Bean的方式定义Bean. 通过注解扫描的方式@Component/@Compo ...
- java之Spring(IOC)注解装配Bean详解
在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看Annotation的魅力所在吧. 先来看看之前的bean ...
随机推荐
- Oracle PL/SQL Developer 上传下载Excel
接到需求,Oracle数据库对Excel数据进行上传和下载,百度后没有很全的方案,整理搜到的资料,以备不时之需. 一.下载Oracle数据到Excel中. 下载数据到Excel在MSSql中很简单,直 ...
- windows下es安装教程
es安装 1.es下载地址:https://www.elastic.co/downloads/past-releases 2.使用es需要先安装好jdk,注意es版本和jdk版本的兼容问题,es6.1 ...
- node.js之内存机制特性
Node.JS的V8引擎具有垃圾回收机制与内存限制的特性,V8的内存限制:64位系统约为1.4GB.32位系统约为0.7GB:V8采用基于分代式垃圾回收机制,堆内存结构分为新生代和老生代,新生代达到一 ...
- TCP客户端 服务端详细代码
本文章转自http://www.myexception.cn/program/1912019.html TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TC ...
- Create a soft keyboard
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- SPOJ:COT2 Count on a tree II
题意 给定一个n个节点的树,每个节点表示一个整数,问u到v的路径上有多少个不同的整数. n=40000,m=100000 Sol 树上莫队模板题 # include <bits/stdc++.h ...
- 原生ajax与封装的ajax使用方法
当我们不会写后端接口来测试ajax时,我们可以使用node环境创建一个本地服务器. 1.创建一个本地服务器可参考http://www.cnblogs.com/heyujun-/p/6793900.ht ...
- windows 打印刻录 代码规范及问题
1.获取CString字节数 int z_Len = WideCharToMultiByte(CP_ACP, 0, z_FileXml.GetBuffer(), z_FileXml.GetLength ...
- idea 使用 git打成jar包到 nexus
1.使用idea生成jar包参考:http://blog.csdn.net/eastgrand/article/details/11945309 2.进入到 自己的工程目录(含有pom.xml的目录) ...
- angularJS articles and resources
http://antjanus.com/blog/web-development-tutorials/front-end-development/comprehensive-beginner-guid ...